为了您的特定目标,您可以使用 copy-of 预定义参数为 param.pix.from 和 param.pix.to ,如下面的XSL:
copy-of
param.pix.from
param.pix.to
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml"/> <!--define parameters FROM and TO--> <xsl:param name="param.pix.from" select="'603|02'" /> <xsl:param name="param.pix.to" select="'613|05'" /> <!--copy required PIXs to matched PIXTransactions block--> <xsl:template match="PIXTransactions[PIXTransactionType = $param.pix.to]"> <xsl:element name="{name()}"> <xsl:copy-of select="*"/> <xsl:copy-of select="/Message/PIXTransactions[PIXTransactionType = $param.pix.from]/*[name() = 'PIX']"/> </xsl:element> </xsl:template> <!--exclude required PIXTransactions from where PIXs blocks were taken--> <xsl:template match="PIXTransactions[PIXTransactionType = $param.pix.from]"/> <!--copy all nodes and attributes--> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
结果如预期:
<?xml version="1.0" encoding="UTF-8"?> <Message> <PIXTransactions> <PIXTransactionType>613|05</PIXTransactionType> <PIX> <Name>A</Name> </PIX> <PIX> <Name>B</Name> </PIX> <PIX> <Name>C</Name> </PIX> <PIX> <Name>D</Name> </PIX> </PIXTransactions> <PIXTransactions> <PIXTransactionType>602|02</PIXTransactionType> <PIX> <Name>F</Name> </PIX> <PIX> <Name>G</Name> </PIX> <PIX> <Name>G</Name> </PIX> </PIXTransactions> </Message>
假如说 Message 元素总是包含 PIXTransactions/PIXTransactionType = 613|05 , 任务可以按如下方式执行:
Message
PIXTransactions/PIXTransactionType
613|05
创建模板匹配 PIXTransactions 含 PIXTransactionType = 613|05 。这应该:
PIXTransactions
PIXTransactionType
<xsl:copy>
apply-templates
copy
PIX
603|02
</xsl:copy>
创建另一个模板匹配 PIXTransactions 含 PIXTransactionType = 603|02 ,用空的内容,来阻止它 处理。
最后一个必需的脚本片段是 身份模板 。
所以整个脚本可能如下所示:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="UTF-8" indent="yes" /> <xsl:strip-space elements="*"/> <xsl:template match="PIXTransactions[PIXTransactionType = '613|05']"> <xsl:copy> <xsl:copy-of select="node()"/> <xsl:copy-of select="../PIXTransactions[PIXTransactionType = '603|02']/PIX"/> </xsl:copy> </xsl:template> <xsl:template match="PIXTransactions[PIXTransactionType = '603|02']"/> <xsl:template match="@*|node()"> <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> </xsl:template> </xsl:transform>
它也适用于 的 XSLT 2.0 强> 。