xpath - 基于查找选择?

时间:2013-07-31 00:50:56

标签: xml xslt xpath

我目前有以下XML:

<root> 
  <entry a="1/2/a.txt"/>
  <entry a="1/2/b.txt"/>
  <entry a="1/2/c.txt"/>
  <entry a="1/2/d.txt"/>
  <err b="2/b.txt"/>
  <err b="2/c.txt"/>
  <err b="2/y.txt"/>
  <err b="2/z.txt"/>
</root> 

使用XSLT 1.0,我想选择所有“条目”,其中@a包含任何“err / @ b”。这可能吗?

e.g。预期成果:

  <entry a="1/2/b.txt"/>
  <entry a="1/2/c.txt"/>

为了给你一个想法,我正在玩下面的xslt(但它显然不起作用)。提前谢谢!

<xsl:copy-of select="//entry[count(//err[contains(@a,@b])>0]"/>

2 个答案:

答案 0 :(得分:0)

<xsl:for-each select="//entry">
   <xsl:if test="//err[contains(current()/@a, @b)]">
      <xsl:copy-of select="."/>
   </xsl:if>
</xsl:for-each>

答案 1 :(得分:0)

您可能更喜欢更具推式的解决方案,如此......

<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:key name="error-files" match ="err" use="@b" />

<xsl:template match="entry[key('error-files',substring-after(@a,'/'))]">
  <xsl:copy-of select="." />
</xsl:template>

</xsl:stylesheet>

或者,如果您不想使用密钥,可以使用...

<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:template match="entry[@a[substring-after(.,'/') = ../../err/@b]]">
  <xsl:copy-of select="." />
</xsl:template>

</xsl:stylesheet>

在回应OP的评论时,是的,将结果存储在变量中没有问题。例如,你可以做......

<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:key name="error-files" match ="err" use="@b" />

<xsl:template match="/*">
  <xsl:variable name="results">
    <xsl:apply-templates />
  </xsl:variable>
  <xsl:copy-of select="$results" />
</xsl:template>

<xsl:template match="entry[key('error-files',substring-after(@a,'/'))]">
  <xsl:copy-of select="." />
</xsl:template>

</xsl:stylesheet>