我目前有以下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]"/>
答案 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>