我需要创建一个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
答案 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>