在XSLT 1.0中将属性转换为具有匹配名称的元素

时间:2009-11-03 01:37:31

标签: xslt xpath

我需要创建一个XSLT,它将源xml中的属性转换为目标xml中的新元素,并且元素名称指定了源xml中属性的“Name”值。

例如:

来源:

<ProductType>Fridge</ProductType>
    <Features>
      <Feature Name="ValveID">somename</Feature>
      <Feature Name="KeyIdentifier">someID</Feature>

结果:

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

预期结果:

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

我的XSLT现在看起来像这样:

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>

我需要更改第4行但不确定如何。任何想法??


d

3 个答案:

答案 0 :(得分:4)

通用解决方案(也是更惯用的):

<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>元素将转换为具有动态名称的新元素,同样适用于<Feature>元素。

答案 1 :(得分:2)

我会尝试

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

as name()为您提供XML元素“功能”的名称(由xsl:for-each选择),而不是当前节点的Name=属性的内容。

答案 2 :(得分:0)

想出来:

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>