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は順応性があり、必要に応じて再定義できますが、2番目の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() 1ベースです。

于 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 に答える