XSLT-1.0:合并并过滤两个XML文件

时间:2016-10-12 16:27:30

标签: xml xslt xpath xslt-1.0

我需要有条件地将两个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部分将打印sectionin.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()

0 个答案:

没有答案