用任何地方的属性值替换XML元素的名称

时间:2018-06-05 13:39:36

标签: xslt

我有一个工作的XSLT,只有当属性名为“AttributeID”时,才会用元素值替换元素名称。它将原始元素名称保存在名为StepClass的新属性中,但它仅在一个级别上有效。

此XML:

<Products>
  <Product>
    <Values>
      <Value AttributeID="One">1</Value>
      <MultiValue AttributeID="Multi1">
        <Value>111</Value>
      </MultiValue>
    </Values>
  </Product>
</Products>

成为这个XML:

 <Products>
  <Product>
    <Values>
      <One StepClass="Value">1</One>
      <Multi1 StepClass="MultiValue">
        <Value>111</Value>
      </Multi1>
    </Values>
  </Product>
</Products>

使用此XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <!-- identity transform -->
  <xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- Change Values/Value value of AttributeID -->
  <!--  <xsl:template match="Values/Value|MultiValue|MetaData/Value">  This was working with 1 level -->
    <xsl:template match="*[@AttributeID]">
    <xsl:element name="{@AttributeID}">
    <xsl:attribute name="StepClass">
      <xsl:value-of select="name()" />
    </xsl:attribute>      
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>

  <!--empty template suppresses this attribute-->
  <xsl:template match="@AttributeID" />

</xsl:stylesheet>

但是只要源XML嵌套产品就会失败。我希望替换能够在任何级别上工作。我在这里做错了什么?

嵌套XML:

<Products>
  <Product>
    <Values>
      <Value AttributeID="One">1</Value>
      <MultiValue AttributeID="Multi1">
        <Value>111</Value>
      </MultiValue>
    </Values>
    <Product>
      <Values>
        <Value AttributeID="Two">2</Value>
        <MultiValue AttributeID="Multi2">
          <Value>222</Value>
        </MultiValue>
      </Values>
    </Product>
  </Product>
</Products>

1 个答案:

答案 0 :(得分:0)

帖子中描述的XSLT按预期工作。