请我想知道我可以使用XSLT合并两个XML文件到一个XML文件中。 我有希望用作显示在预期output.I合并到XML文件中这些都XML文件要从该第二文件与相同数量的对应的块的文件1包括每个节点Hn的 。
Failel:
<Test>
<R1>
<Th1>
here are some instruction.
</Th1>
</R1>
<R2>
<Th2>
here are some instruction.
</Th2>
</R2>
<R3>
<Th3>
here are some instruction.
</Th3>
</R3>
</Test>
文件2:
<test1>
<H1>
here are some instruction.
</H1>
<H2>
here are some instruction.
</H2>
<H3>
here are some instruction.
</H3>
</test1>
这里是预期的输出:
<test2>
<R1>
<H1>
here are some instruction.
</H1>
<Th1>
here are some instruction.
</Th1>
</R1>
<R2>
<H2>
here are some instruction.
</H2>
<Th2>
here are some instruction.
</Th2>
</R2>
<R3>
<H3>
here are some instruction.
</H3>
<Th3>
here are some instruction.
</Th3>
</R3>
</test2>
谢谢你的帮助。
一,本XSLT 1.0转换 :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:variable name="vDigits" select="'0123456789'"/>
<xsl:variable name="vDoc2" select="document('file:///c:/temp/delete/file2.xml')"/>
<xsl:template match="/*">
<test2><xsl:apply-templates/></test2>
</xsl:template>
<xsl:template match="/*/*">
<xsl:copy>
<xsl:text>
</xsl:text>
<xsl:copy-of select=
"$vDoc2/*/*
[translate(name(),translate(name(),$vDigits,''),'')
=
translate(name(current()),translate(name(current()),$vDigits,''),'')
]"/>
<xsl:copy-of select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当施加在第一XML文档 (file1.xml):
<Test>
<R1>
<Th1>
here are some instruction.
</Th1>
</R1>
<R2>
<Th2>
here are some instruction.
</Th2>
</R2>
<R3>
<Th3>
here are some instruction.
</Th3>
</R3>
</Test>
和具有第二XML文档驻留在c:\temp\delete\file2.xml
:
<test1>
<H1>
here are some instruction.
</H1>
<H2>
here are some instruction.
</H2>
<H3>
here are some instruction.
</H3>
</test1>
产生想要的,正确的结果:
<test2>
<R1>
<H1>
here are some instruction.
</H1>
<Th1>
here are some instruction.
</Th1>
</R1>
<R2>
<H2>
here are some instruction.
</H2>
<Th2>
here are some instruction.
</Th2>
</R2>
<R3>
<H3>
here are some instruction.
</H3>
<Th3>
here are some instruction.
</Th3>
</R3>
</test2>
说明 :
正确使用“ 双转换 ”的方法首先由迈克尔·凯全世界展示。
II。 XSLT 2.0溶液 :
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:variable name="vDigits" select="'0123456789'"/>
<xsl:variable name="vDoc2" select="document('file:///c:/temp/delete/file2.xml')"/>
<xsl:template match="/*">
<test2><xsl:apply-templates/></test2>
</xsl:template>
<xsl:template match="/*/*">
<xsl:if test="not(matches(name(), '^.+\d+$'))">
<xsl:message terminate="yes">
Element Name doesn't end with number: <xsl:sequence select="name()"/>
</xsl:message>
</xsl:if>
<xsl:copy>
<xsl:text>
</xsl:text>
<xsl:copy-of select=
"$vDoc2/*/*
[replace(name(),'^.+(\d+)$', '$1')
=
replace(name(current()),'^.+(\d+)$', '$1')
]"/>
<xsl:copy-of select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
说明 :
正确使用标准的XPath 2.0函数的matches()
和replace()