我有以下 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 实现此目标?任何帮助将不胜感激!
您需要从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] 删除。
我来说两句