2013-07-31 57 views
1

我目前得到了以下XML:xpath - 根据查找选择?

<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]"/> 

回答

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

嗨马克斯,感谢您的解决方案。就在我接受它之前,XSLT1.0中是否可以将结果存储在xsl:变量中? 例如 或 的

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>