使用xslt基于节点文本连接两个xml文件
是否可以基于像SQL这样的节点值连接两个xml文件 我有两个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
<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文件,它只是一个人工根节点,以及附加在它下面的两个文件。您也可以使用该功能读取文件以同时访问它们。非常感谢您的帮助、解释和有用的参考。它起作用了!非常感谢您的帮助、解释和有用的参考资料。它起作用了!