是否可以使用XSLT将部分元素名称更改为具有增量编号的另一个元素名称。
就像我只想在开头用UPC_更改元素名称
<product>
<UPC_US>123</UPC_US>
<UPC_UK>223</UPC_UK>
<UPC_JP>345</UPC_JP>
<other>unchange</other>
</product>
<product>
<UPC_US>1234</UPC_US>
<UPC_CA>1235</UPC_CA>
<other>unchange</other>
</product>
到此?
<product>
<UPC_1>123</UPC_1>
<UPC_2>223</UPC_2>
<UPC_3>345</UPC_3>
<other>unchange</other>
</product>
<product>
<UPC_1>1234</UPC_1>
<UPC_2>1235</UPC_2>
<other>unchange</other>
</product>
答案 0 :(得分:4)
使用XSLT可以很容易地实现这一点。首先,您将创建一个模板,以匹配以 UPC
开头的元素<xsl:template match="product/*[starts-with(local-name(), 'UPC')]">
然后,您将根据元素的位置
创建一个带有修订名称的新元素<xsl:element name="UPC_{position()}">
请注意在创建名称时使用“属性值模板”。花括号表示这是一个要计算的表达式,而不是字面输出。
这是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="product/*[starts-with(local-name(), 'UPC')]">
<xsl:element name="UPC_{position()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
应用XML时,输出以下内容
<products>
<product>
<UPC_1>123</UPC_1>
<UPC_2>223</UPC_2>
<UPC_3>345</UPC_3>
<other>unchange</other>
</product>
<product>
<UPC_1>1234</UPC_1>
<UPC_2>1235</UPC_2>
<other>unchange</other>
</product>
</products>
话虽如此,只有你的UPC元素永远是第一个元素才会有效。如果您将此作为输入
<product>
<UPC_US>123</UPC_US>
<UPC_UK>223</UPC_UK>
<UPC_JP>345</UPC_JP>
<other>unchange</other>
</product>
输出就是这个
<products>
<product>
<UPC_1>123</UPC_1>
<UPC_2>223</UPC_2>
<other>unchange</other>
<UPC_4>345</UPC_4>
</product>
</products>
如果这不是您想要的,您可以使用 xsl:number 来计算元素。试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="product/*[starts-with(local-name(), 'UPC')]">
<xsl:variable name="count">
<xsl:number count="*[starts-with(local-name(), 'UPC')]"/>
</xsl:variable>
<xsl:element name="UPC_{$count}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在这种情况下,第二个例子会产生这个
<products>
<product>
<UPC_1>123</UPC_1>
<UPC_2>223</UPC_2>
<other>unchange</other>
<UPC_3>345</UPC_3>
</product>
</products>
在这两种情况下,请记下使用Indentity Transform模板按原样复制所有其他元素。
答案 1 :(得分:1)
是的,这是可能的。 xsl:element
允许您动态创建新的元素名称。