3

我正在努力转变

<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 是我无法更改的遗留系统的一部分。我正确地找到的大部分内容都指向我使用属性,但不幸的是,它是我希望编辑的元素本身。

任何人都可以提供帮助,或者如果没有,请指出我正确的方向?

4

3 回答 3

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(属性值模板)。

于 2012-08-31T14:21:05.173 回答
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()是基于一的。

于 2012-08-31T14:07:32.223 回答
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>
于 2012-08-31T14:07:36.247 回答