我正在尝试改造
<Address>
<Line>Some street1</Line>
<Line>Some street2</Line>
<Line>Some street3</Line>
...
</Address>
进入
<Address1>Some street1</Address1>
<Address2>Some street2</Address2>
<Address3>Some street3</Address3>
<Address4></Address4>
<Address5></Address5>
第一个xml是可塑的,如果需要可以重新定义,但是第二个xml是遗留系统的一部分,我无法改变。 我找到的大部分内容都正确地指出了我使用属性但不幸的是,它是我想编辑的元素本身。
是否有人能够提供帮助,如果没有,请指出我正确的方向?
答案 0 :(得分:2)
这很容易,也可能是最简短的解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="Line">
<xsl:element name="Address{position()}"><xsl:apply-templates/></xsl:element>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<Address>
<Line>Some street1</Line>
<Line>Some street2</Line>
<Line>Some street3</Line>
</Address>
产生了想要的正确结果:
<Address1>Some street1</Address1>
<Address2>Some street2</Address2>
<Address3>Some street3</Address3>
<强>解释强>:
正确使用 xsl:element
和AVT( Attribute Value Templates )。
答案 1 :(得分:1)
查看<xsl:element>
元素。在其name
属性中,您还可以提供在运行XSLT时计算的表达式:
<xsl:template match="Line">
<xsl:element name="{concat('Address', position())}"><xsl:value-of select="text()"/></xsl:element>
</xsl:template>
更新: position()
是基于一个的。
答案 2 :(得分:1)
可以通过使用当前position()
:
<xsl:template match="/Address">
<Addresses>
<xsl:for-each select="Line">
<xsl:variable name="elename" select="concat('Address', string(position()))"></xsl:variable>
<xsl:element name="{$elename}">
<xsl:value-of select="text()"/>
</xsl:element>
</xsl:for-each >
</Addresses>
</xsl:template>