我正在尝试将多个属性添加到单个节点中,而无需对名称进行硬编码。 输入xml 如下所示:
<bom>
<columns>
<column id="0">Name</column>
<column id="1">ID</column>
<column id="2">Description</column>
</columns>
<rows>
<row number="0" level="0" position="">
<cell column="0">FooName1</cell>
<cell column="1">1000</cell>
<cell column="2">FooDescription1</cell>
</row>
<row number="1" level="1" position="">
<cell column="0">FooName2</cell>
<cell column="1">2000</cell>
<cell column="2">FooDescription2</cell>
</row>
<row number="2" level="1" position="">
<cell column="0">FooName3</cell>
<cell column="1">3000</cell>
<cell column="2">FooDescription3</cell>
</row>
</rows>
</bom>
我希望输出xml 看起来像这样:
<xml>
<Item Name="FooName1"
ID="1000"
Description="FooDescription1"
>
<BOM>
<Child Name="FooName2"
ID="2000"
Description="FooDescription2"
/>
<Child Name="FooName3"
ID="3000"
Description="FooDescription3"
/>
</BOM>
</Item>
</xml>
到目前为止,我的XSLT(版本1.0)看起来像这样:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" indent="yes" encoding="utf-8"/>
<xsl:template match="bom">
<impxml>
<Item>
<xsl:apply-templates select="columns/column" />
</Item>
</impxml>
</xsl:template>
<xsl:template match="columns/column">
<!-- <xsl:value-of select="."/> Fetch all column values -->
<xsl:for-each select=".">
<xsl:attribute name="TEST">TEST</xsl:attribute>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<xsl:attribute name="">
只接受一个硬编码名称。如何遍历columns \ column中的所有值并将它们作为属性添加到同一Item或Child节点?
我是XSLT的新手,所以我很感激这里的任何输入/帮助。谢谢。
答案 0 :(得分:1)
考虑使用ancestor::*
在顶部检索<column>
值。然后使用{path}
作为动态属性名称,该名称相当于属性之外的<xsl:value-of select="path" />
。两者都使用@id
匹配相应的@column
和xsl:variable
值:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" indent="yes" encoding="utf-8"/>
<xsl:template match="bom">
<impxml>
<xsl:apply-templates select="rows/row" />
</impxml>
</xsl:template>
<xsl:template match="rows/row">
<Item>
<xsl:apply-templates select="cell" />
</Item>
</xsl:template>
<xsl:template match="cell">
<xsl:variable name="curr_col"><xsl:value-of select="@column"/></xsl:variable>
<xsl:attribute name="{ancestor::bom/columns/column[@id=$curr_col]}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<impxml>
<Item Name="FooName1" ID="1000" Description="FooDescription1"/>
<Item Name="FooName2" ID="2000" Description="FooDescription2"/>
<Item Name="FooName3" ID="3000" Description="FooDescription3"/>
</impxml>