Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据条件连接多个XML元素_Xml_Xslt_Xslt 1.0_Xslt 2.0_Soa - Fatal编程技术网

如何根据条件连接多个XML元素

如何根据条件连接多个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

我有以下结构的XMl文件。每个PIX事务都有多条的PIX消息。它们根据事务类型进行分组。我被要求加入两种特殊的PixTransactionType=613 | 05和603 | 02的PIX消息

<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