【问题标题】:XSLT Getting values based on other elements' valuesXSLT 根据其他元素的值获取值
【发布时间】:2017-10-08 09:13:24
【问题描述】:

我有以下 XML:

   <data>
      <name>att1</name>
      <value>BLUE</value>
   </data>  
   <data>
      <name>id</name>
      <value>5864828</value>
    </data>
    <data>
      <name>att2</name>
      <value>XL</value>
    </data>
    <data>
      <name>status</name>
      <value>In-Stock</value>
    </data>

我需要将其转换为:

<product>
  <id>5864828</id>
  <color>BLUE</color>
  <size>XL</size>
  <avail>In-Stock</avail>
</product>

我发现了以下问题: Concatenate XSLT element values based on another element value 但在该线程中,提供的解决方案是在更改属性名称时使用“xsl-if”,它并不关心更改数据的显示顺序。

所以我的问题是,有没有一种方法可以让我不必使用 xsl-if 并且可以实际更改属性的顺序?

【问题讨论】:

  • “有没有一种方法可以让我不必使用 xsl-if 并且可以实际更改属性的顺序?”。这很令人困惑。您的输入 XML 和所需的输出都不包含任何属性。并且输入没有根元素。
  • @mzjn 很抱歉造成混淆,属性指的是产品属性(颜色、尺寸等)。

标签: xml xslt


【解决方案1】:

通过按顺序选择匹配的模板和(而不是xsl-ifxsl-choose 创建元素,可以实现所需的输出。

我发明了一个任意的 &lt;root&gt; 元素来补偿您的示例 xml 中缺少的元素。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <!-- always start out matching the document root -->
    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <!-- match the root element (not shown in your example) -->
    <xsl:template match="root">
        <xsl:element name="product">
            <!-- apply templates in the desired order, specifically selecting matching 'data' elements -->
            <xsl:apply-templates select="data[name/text() = 'id']" />
            <xsl:apply-templates select="data[name/text() = 'att1']" />
            <xsl:apply-templates select="data[name/text() = 'att2']" />
            <xsl:apply-templates select="data[name/text() = 'status']" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="data">
        <!-- choose the desired output element based on the current data/name text -->
        <xsl:choose>
            <xsl:when test="./name[text() = 'id']">
                <xsl:element name="id">
                    <xsl:value-of select="./value" />
                </xsl:element>
            </xsl:when>
            <xsl:when test="./name[text() = 'att1']">
                <xsl:element name="color">
                    <xsl:value-of select="./value" />
                </xsl:element>
            </xsl:when>
            <xsl:when test="./name[text() = 'att2']">
                <xsl:element name="size">
                    <xsl:value-of select="./value" />
                </xsl:element>
            </xsl:when>
            <xsl:when test="./name[text() = 'status']">
            <xsl:element name="avail">
                    <xsl:value-of select="./value" />
                </xsl:element>
            </xsl:when>
            <xsl:otherwise />
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

关于 xslt 最常见的误解是尝试 xsl-foreach - 使用匹配模板是可行的方法,但可能很难表达所需的 xpath 以获得所需的条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2020-04-22
    相关资源
    最近更新 更多