我需要有条件地将两个xml文件与xslt-1.0合并。第一个文件是:
<rootnode>
<section id="1" >
<outer param="p1" >
<inner />
<inner />
</outer>
<outer >
<inner />
</outer>
<outer />
<outer />
</section>
<section id="3" >
<outer >
<inner />
<inner />
<inner />
</outer>
</section>
</rootnode>
第二个文件是:
$ cat res.xml
<rootnode>
<section id="1" status="fail">
<outer param="p1" status="fail">
<inner status="fail"/>
<inner status="pass"/>
</outer>
<outer status="pass">
<inner status="pass"/>
</outer>
<outer status="pass"/>
<outer status="fail"/>
</section>
<section id="2" status="fail">
<outer status="fail">
<inner status="pass"/>
<inner status="fail"/>
<inner status="inc"/>
</outer>
</section>
<section id="6" status="inc">
<outer status="inc">
<inner status="inc"/>
</outer>
</section>
</rootnode>
到目前为止,我有这个XSLT文件:
$ cat filter.xsl
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="doc" select="document('in.xml')"/>
<!-- part 1 -->
<xsl:template match="/">
<xsl:variable name="var" select="/rootnode/section" />
<xsl:for-each select="$doc//section[not(@id = $var/@id)] ">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:template>
<!-- part 2 -->
<!--xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[@status[not(normalize-space()='fail')]]"/>
<xsl:template match="@*[local-name() = 'status' "/-->
</xsl:stylesheet>
我使用xsltproc
来处理文件
$ xsltproc filter.xsl res.xml
第1部分将打印section
中in.xml
而不是res.xml
中的res.xml
个节点。如果我注释掉第1部分并取消注释第2部分,那么我会从fail
获得具有section
状态的节点。我不知何故需要结合这些功能,即我需要获取仅在文件in.xml
中的所有res.xml
个节点以及fail
中具有id
状态的所有节点。节点由section
中的$ cat final.xml
<?xml version="1.0" encoding="UTF-8"?>
<rootnode>
<section id="1">
<outer param="p1">
<inner/>
</outer>
<outer/>
</section>
<section id="2">
<outer>
<inner/>
</outer>
</section>
<section id="3">
<outer>
<inner/>
<inner/>
<inner/>
</outer>
</section>
</rootnode>
属性唯一标识。
对于上述两个文件,结果文件必须如下所示:
array_column()