在XSLT1.0中将属性转换为具有匹配名称的元素
我需要创建一个XSLT,将源xml中的一个属性转换为目标xml中的一个新元素,并将元素名分配给源xml中属性的“name”值 例如: 资料来源:在XSLT1.0中将属性转换为具有匹配名称的元素,xslt,xpath,Xslt,Xpath,我需要创建一个XSLT,将源xml中的一个属性转换为目标xml中的一个新元素,并将元素名分配给源xml中属性的“name”值 例如: 资料来源: <ProductType>Fridge</ProductType> <Features> <Feature Name="ValveID">somename</Feature> <Feature Name="KeyIdentifier">someID&
<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>
1
2.
3.
4.
5.
6.
7.
8.
我需要更改第4行,但不确定如何更改。有什么想法吗
我会试试看
<xsl:element name="{@Name}">
由于name()
为您提供了XML元素“Feature”(由xsl:for each
选择)的名称,而不是当前节点的name=
属性的内容。找到了它:
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>
1
2.
3.
3.
4.
5.
6.
7.
8.
通用解决方案(也更惯用):
元素被转换成具有动态名称的新元素,
元素也是如此。Dipesh,我将使用Tomalak的实现,因为它是通用的,并且为增强提供了更大的灵活性
<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>