开发者

Transforming attributes to elements with matching name in XSLT 1.0

I need to create an XSLT which tranforms an attribute in the source xml to a new element in the target xml with the element name assigned the "Name" value of the attribute in the source xml.

Eg:

Source:

<ProductType>Fridge</ProductType>
    <Features>
      &l开发者_运维百科t;Feature Name="ValveID">somename</Feature>
      <Feature Name="KeyIdentifier">someID</Feature>

Result:

<Fridge>
    <Feature>somename</Feature>
    <Feature>someID</Feature>

Expected Result:

  <Fridge>
        <ValueID>somename</ValueID>
        <KeyIdentifier>someID</KeyIdentifier>

My XSLT looks like this for now:

1 <Fridge>
2       <xsl:for-each select="$var6_ProductData/Features/Feature">
3            <xsl:variable name="var8_Feature" select="."/>
4            <xsl:element name="{name()}">
5                 <xsl:value-of select="string($var8_Feature)"/>
6            </xsl:element>
7       </xsl:for-each>
8 </Fridge>

I need to change line 4 but not sure how. Any ideas??


D


Generic solution (and more idiomatic, too):

<xsl:template match="ProductType">
  <xsl:element name="{text()}">
    <xsl:apply-templates select="Features/Feature" />
  </xsl:elemment>
</xsl:template>

<xsl:template match="Features/Feature">
  <xsl:element name="{@Name}">
    <xsl:value-of select="text()" />
  </xsl:elemment>
</xsl:template>

<ProductType> elements are transformed into a new element with a dynamic name, same goes for <Feature> elements.


I would try

<xsl:element name="{@Name}">

as name() gives you the name of the XML element "Feature" (selected by the xsl:for-each), not the content of the current node's Name= attribute.


Figured it out:

1 <Fridge>
2       <xsl:for-each select="$var6_ProductData/Features/Feature">
3            <xsl:variable name="var8_Feature" select="."/>
3            <xsl:variable name="var9_Feature" select="@Name"/>
4            <xsl:element name="{$var9_Feature}">
5                 <xsl:value-of select="string($var8_Feature)"/>
6            </xsl:element>
7       </xsl:for-each>
8 </Fridge>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜