1

我目前有以下 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”。这可能吗?

例如预期结果:

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

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

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

2 回答 2

0
<xsl:for-each select="//entry">
   <xsl:if test="//err[contains(current()/@a, @b)]">
      <xsl:copy-of select="."/>
   </xsl:if>
</xsl:for-each>
于 2013-07-31T01:05:03.370 回答
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>
于 2013-07-31T03:21:29.313 回答