2013-07-31 78 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>