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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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
使用xslt基于节点文本连接两个xml文件_Xml_Xslt_Join - Fatal编程技术网

使用xslt基于节点文本连接两个xml文件

使用xslt基于节点文本连接两个xml文件,xml,xslt,join,Xml,Xslt,Join,是否可以基于像SQL这样的节点值连接两个xml文件 我有两个xml文件: <MailPackage> <Mail> <id>1</id> <field_1>foo</field_1> ... <field_n>bar</field_n> </Mail> <Mail> <id>2</i

是否可以基于像SQL这样的节点值连接两个xml文件

我有两个xml文件:

<MailPackage>
   <Mail>
      <id>1</id>
      <field_1>foo</field_1>
      ...
      <field_n>bar</field_n>
   </Mail>
   <Mail>
      <id>2</id>
      <field_1>... </field_1>
       ...
   </Mail>
   ....
</MailPackackage>

1.
福
...
酒吧
2.
... 
...
....


1.
10
....
1.
50
....
2.
20
....
现在,我想通过'id'节点的值连接这两个xml文件。预期结果是:

<MailPackage>
   <Mail>
      <id>1 </id>
      <field_1>foo </field_1>
      ...
      <field_n>bar </field_n>
      <Transaction_data>
         <Transaction>
            <Account_number>10</Account_number>
             ...
         </Transaction>
         <Transaction>
            <Account_number>50 </Account_number>
             ...
         </Transaction>
      </Transaction_data>
   </Mail>
   <Mail>
      <id> 2 </id>
      <Field_1> ...</Field_1>
       ...
      <Transactions>
         <Transaction>
            <Account_number> 20 </Account_number>
             ....
         </Transaction>
      </Transactions>

   </Mail>
</MailPackage>

1.
福
...
酒吧
10
...
50
...
2.
...
...
20
....
你们能提供一些帮助,如何开始吗?

你们可以定义一个
来按ID对
事务
元素进行分组,然后将它们插入主文件中的适当位置。解释使用
从辅助文档中选择与键匹配的节点的技巧-如果您有XSLT 2.0,则不需要此技巧,只需使用
key()
函数的三参数形式即可

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

  <xsl:key name="trans" match="Transaction" use="id" />

  <!-- Identity template to copy everything we don't specifically override -->
  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
  </xsl:template>

  <!-- override for Mail elements -->
  <xsl:template match="Mail">
    <xsl:copy>
      <!-- copy all children as normal -->
      <xsl:apply-templates select="@*|node()" />
      <xsl:variable name="myId" select="id" />
      <Transaction_data>
        <xsl:for-each select="document('transactions.xml')">
          <!-- process all transactions with the right ID -->
          <xsl:apply-templates select="key('trans', $myId)" />
        </xsl:for-each>
      </Transaction_data>
    </xsl:copy>
  </xsl:template>

  <!-- omit the id element when copying a Transaction -->
  <xsl:template match="Transaction/id" />
</xsl:stylesheet>

您可以将
文档作为主输入文档进行处理,样式表在内部引用事务文档

这一切都假定您的
邮件
元素都有唯一的ID。

您可以定义一个
来按ID对
事务
元素进行分组,然后将它们插入主文件中的适当位置。解释使用
从辅助文档中选择与键匹配的节点的技巧-如果您有XSLT 2.0,则不需要此技巧,只需使用
key()
函数的三参数形式即可

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

  <xsl:key name="trans" match="Transaction" use="id" />

  <!-- Identity template to copy everything we don't specifically override -->
  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
  </xsl:template>

  <!-- override for Mail elements -->
  <xsl:template match="Mail">
    <xsl:copy>
      <!-- copy all children as normal -->
      <xsl:apply-templates select="@*|node()" />
      <xsl:variable name="myId" select="id" />
      <Transaction_data>
        <xsl:for-each select="document('transactions.xml')">
          <!-- process all transactions with the right ID -->
          <xsl:apply-templates select="key('trans', $myId)" />
        </xsl:for-each>
      </Transaction_data>
    </xsl:copy>
  </xsl:template>

  <!-- omit the id element when copying a Transaction -->
  <xsl:template match="Transaction/id" />
</xsl:stylesheet>

您可以将
文档作为主输入文档进行处理,样式表在内部引用事务文档


这一切都假设您的
邮件
元素都有唯一的ID。

当然。关键是一次只能转换一个XML,因此基本上有两条路径可供选择:创建第三个XML文件,它只是一个人工根节点,以及附加在它下面的两个文件。当然,您也可以使用该功能读取文件以同时访问它们。关键是一次只能转换一个XML,因此基本上有两条路径可供选择:创建第三个XML文件,它只是一个人工根节点,以及附加在它下面的两个文件。您也可以使用该功能读取文件以同时访问它们。非常感谢您的帮助、解释和有用的参考。它起作用了!非常感谢您的帮助、解释和有用的参考资料。它起作用了!