如何根据条件连接多个XML元素
我有以下结构的XMl文件。每个PIX事务都有多条的PIX消息。它们根据事务类型进行分组。我被要求加入两种特殊的PixTransactionType=613 | 05和603 | 02的PIX消息如何根据条件连接多个XML元素,xml,xslt,xslt-1.0,xslt-2.0,soa,Xml,Xslt,Xslt 1.0,Xslt 2.0,Soa,我有以下结构的XMl文件。每个PIX事务都有多条的PIX消息。它们根据事务类型进行分组。我被要求加入两种特殊的PixTransactionType=613 | 05和603 | 02的PIX消息 <Message> <PIXTransactions> <PIXTransactionType>613|05</PIXTransactionType> <PIX> <Name
<Message>
<PIXTransactions>
<PIXTransactionType>613|05</PIXTransactionType>
<PIX>
<Name>A</Name>
</PIX>
</PIXTransactions>
<PIXTransactions>
<PIXTransactionType>603|02</PIXTransactionType>
<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>
613|05
A.
603|02
B
C
D
602|02
F
G
G
我得到的XML应该是
<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>
613|05
A.
B
C
D
602|02
F
G
G
如何在XSLT 1.0或2.0中实现这一点?对于您的特定目标,您可以使用带有预定义参数的
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>
613|05
A.
B
C
D
602|02
F
G
G
假设消息
元素始终包含
PIXTransactions/PIXTransactionType
=613 | 05
,
该任务可按如下方式执行:
PIXTransactions
包含
PIXTransactionType
=613 | 05
。它应当:
- 复制自己的开始标记(
) - 复制自己的内容(您甚至不需要
对它的孩子来说,普通的应用模板
复制将更快)
- 仅从同级
元素复制PIXTransactions
元素 包含PIX
=PIXTransactionType
603 | 02
- 复制自己的结束标记(
)
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为什么
603 | 02
输入中的PIX
元素在输出中映射到613 | 05
?