我是XSLT的新手,所以请耐心等待。
我有两个xml文件,我试图使用XSLT连接在一起。我想组合文件,使第二个文件中指定的任何值覆盖第一个。 E.g。
firstFile.xml
<person>
<person-name>Sandy</person-name>
<person-age>21</person-age>
</person>
<person>
<person-name>Bob</person-name>
<person-age>15</person-age>
</person>
Override.xml的
<person>
<person-name>Bob</person-name>
<person-age>21</person-age>
</person>
结果:
<person>
<person-name>Sandy</person-name>
<person-age>21</person-age>
</person>
<person>
<person-name>Bob</person-name>
<person-age>21</person-age>
</person>
我连接2个文件的模板如下:
<xsl:template match="/">
<!-- MainFile -->
<xsl:copy-of select="/*"/>
<!-- Overrides-->
<xsl:copy-of select="document($overrideFile)/*"/>
</xsl:template>
我试图设置for-each循环,以便在复制firstFile.xml中的每个人之前检查override.xml中是否有相应的节点,但是不成功。
任何提示都将非常感谢
答案 0 :(得分:3)
此转化:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pDoc2Url" select="'file:///c:/temp/delete/override.xml'"/>
<xsl:variable name="vDoc2" select="document($pDoc2Url)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<t>
<xsl:apply-templates
select="person[not(person-name = $vDoc2/*/person/person-name)]"/>
<xsl:apply-templates select="$vDoc2/*/person"/>
</t>
</xsl:template>
</xsl:stylesheet>
应用于第一个提供的XML文档(包装到单个顶部元素中 - 构成格式良好的XML文档):
<t>
<person>
<person-name>Sandy</person-name>
<person-age>21</person-age>
</person>
<person>
<person-name>Bob</person-name>
<person-age>15</person-age>
</person>
</t>
并作为参数传递第二个文档(再次包装到顶部元素中)所在的文件名 - 这是更正的第二个文档:
<强> C:/temp/delete/override.xml 强>:
<t>
<person>
<person-name>Bob</person-name>
<person-age>21</person-age>
</person>
</t>
会产生想要的正确结果:
<t>
<person>
<person-name>Sandy</person-name>
<person-age>21</person-age>
</person>
<person>
<person-name>Bob</person-name>
<person-age>21</person-age>
</person>
</t>
<强> II。一个更短但不太灵活的解决方案 - 没有身份规则,也没有xsl:apply-templates
:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pDoc2Url" select="'file:///c:/temp/delete/override.xml'"/>
<xsl:variable name="vDoc2" select="document($pDoc2Url)"/>
<xsl:template match="/*">
<t>
<xsl:copy-of
select="person[not(person-name = $vDoc2/*/person/person-name)]"/>
<xsl:copy-of select="$vDoc2/*/person"/>
</t>
</xsl:template>
</xsl:stylesheet>