如何使用 xslt 移动 xml 元素?

罗伯托·巴西勒

我有以下 XML:

<?xml version="1.0" encoding="UTF-8"?> 
<flow xmlns:*** xmlns:xsi=*** xsi:schemaLocation=***> 
    <version>1.0</version> 
    <id>15</id> 
    <date>2018-01-01</date> 
    <sender> 
        <senderId> 
            <idType>G</idType> 
            <idCode>code</idCode> 
        </senderId> 
        <senderName>name</senderName> 
    </sender> 
    <paymentsNumber>2</paymentsNumber> 
    <paymentsTotal>800.40</paymentsTotal> 
    <payment> 
        <paymentId>1</paymentId> 
        <paymentAmount>400.20</paymentAmount> 
        <paymentResult>0</paymentResult> 
        <paymentDate>2018-02-01</paymentDate> 
    </payment> 
    <payment> 
        <paymentId>2</paymentId> 
        <paymentAmount>400.20</paymentAmount> 
        <paymentResult>0</paymentResult> 
        <paymentDate>2018-02-02</paymentDate> 
    </payment> 
</flow>

我必须进入<payment>元素

<version>1.0</version> 
<id>15</id> 
<date>2018-01-01</date>

获取以下xml:

<?xml version="1.0" encoding="UTF-8"?> 
<flow xmlns:*** xmlns:xsi=*** xsi:schemaLocation=***> 
    <sender> 
        <senderId> 
            <idType>G</idType> 
            <idCode>code</idCode> 
        </senderId> 
        <senderName>name</senderName> 
    </sender> 
    <paymentsNumber>2</paymentsNumber> 
    <paymentsTotal>800.40</paymentsTotal> 
    <payment> 
        <version>1.0</version> 
        <id>15</id> 
        <date>2018-01-01</date> 
        <paymentId>1</paymentId> 
        <paymentAmount>400.20</paymentAmount> 
        <paymentResult>0</paymentResult> 
        <paymentDate>2018-02-01</paymentDate> 
    </payment> 
    <payment>
        <version>1.0</version> 
        <id>15</id> 
        <date>2018-01-01</date> 
        <paymentId>2</paymentId> 
        <paymentAmount>400.20</paymentAmount> 
        <paymentResult>0</paymentResult> 
        <paymentDate>2018-02-02</paymentDate> 
    </payment> 
</flow>

如何使用 XSLT 实现此目标?任何帮助将不胜感激!

Aniket V

您需要从identity template将所有元素按原样复制到输出 XML 开始。

<xsl:template match="node() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
</xsl:template>

接下来,<version><id><date>要移动的儿童<payment>元素。这可以通过将它们复制到<payment>.

<xsl:template match="payment">
    <xsl:copy>
        <xsl:copy-of select="../version | ../id | ../date" />
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

最后,将删除<version>,<id><date>under <flow>,因此创建一个与这些元素匹配的模板,但什么也不做。

<xsl:template match="version | id | date" />

完整的 XSLT 如下

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" />
    <xsl:strip-space elements="*" />

    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="payment">
        <xsl:copy>
            <xsl:copy-of select="../version | ../id | ../date" />
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="version | id | date" />
</xsl:stylesheet>

输出

<flow>
    <sender>
        <senderId>
            <idType>G</idType>
            <idCode>code</idCode>
        </senderId>
        <senderName>name</senderName>
    </sender>
    <paymentsNumber>2</paymentsNumber>
    <paymentsTotal>800.40</paymentsTotal>
    <payment>
        <version>1.0</version>
        <id>15</id>
        <date>2018-01-01</date>
        <paymentId>1</paymentId>
        <paymentAmount>400.20</paymentAmount>
        <paymentResult>0</paymentResult>
        <paymentDate>2018-02-01</paymentDate>
    </payment>
    <payment>
        <version>1.0</version>
        <id>15</id>
        <date>2018-01-01</date>
        <paymentId>2</paymentId>
        <paymentAmount>400.20</paymentAmount>
        <paymentResult>0</paymentResult>
        <paymentDate>2018-02-02</paymentDate>
    </payment>
</flow>

请注意这里没有考虑命名空间。在您的 XSLT 中,您需要相应地映射这些名称空间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章