2013-07-31 7 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, я хотел бы, чтобы выбрать все "записи" S, где @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

Hi Max, спасибо за решение. Как раз перед тем, как принять его, есть ли в 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> 
Смежные вопросы