使用xslt基于节点文本加入两个xml文件

时间:2012-10-24 12:48:53

标签: 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</id>
      <field_1>... </field_1>
       ...
   </Mail>
   ....
</MailPackackage>

<Transaction_data>
   <Transaction>
     <id>1</id>
     <account_number>10 </account_number>
     ....
   </Transaction>
   <Transaction>
     <id>1</id>
     <account_number> 50 </account_number>
      ....
   </Transaction>
   <Transaction>
     <id>2</id>
     <account_number> 20 </account_number>
      ....
   </Transaction>
</Transaction_data>

现在我想通过'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 个答案:

答案 0 :(得分:1)

您可以定义<xsl:key>按ID分组Transaction元素,然后将它们插入主文件中的适当位置。 This article解释了使用<xsl:for-each>选择与辅助文档中的键匹配的节点的技巧 - 如果你有XSLT 2.0,则不需要这个技巧,只需使用{{1的三参数形式`功能。

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> 文档作为主输入文档,样式表在内部引用交易文档。

这一切都假设您的<MailPackage>元素都具有唯一ID。