XSLT - соответствующие узлы, которые имеют определенный узел внутри себя (например, jQuery ": has") - PullRequest
2 голосов
/ 05 марта 2009

Допустим, у меня есть следующий XML-файл

<a id="123">
   <b type="foo" value="1" />
   <b type="baz" value="1" />
</a>
<a id="789">
  <b type="bar" value="12" />
</a>
<a id="999">
   <b type="foo", value="2" />
</a>

Я хочу получить список всех узлов 'a', имеющих подузел 'b' с type = "foo" и значением = "1". Вы можете сделать нечто подобное в jQuery с помощью селектора ": has".

Для записи, я планирую использовать xmlstarlet в командной строке (но я не женат, чтобы делать это таким образом), так что xslt, который работает таким образом, будет лучше.

Ответы [ 4 ]

6 голосов
/ 05 марта 2009

как то так:

a[b[@type='foo'][@value='1']]

должен сделать трюк

2 голосов
/ 05 марта 2009

Это можно сделать с помощью одного выражения XPath, как указано в ответе гизмо.

Поскольку вопрос специально для XSLT, вот эффективное решение XSLT с использованием ключей:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>
<!--                                      --> 
 <xsl:key name="kAByBTypeVal" 
  match="a"
  use="concat(b/@type,'+',b/@value)"/>
<!--                                      -->       
    <xsl:template match="/">
      <xsl:copy-of select=
       "key('kAByBTypeVal', 'bar+12')"/>
    </xsl:template>
</xsl:stylesheet>

Когда вышеуказанное преобразование применяется к этому документу XML :

<t>
    <a id="123">
        <b type="foo" value="1" />
        <b type="baz" value="1" />
    </a>
    <a id="789">
        <b type="bar" value="12" />
    </a>
    <a id="999">
        <b type="foo" value="2" />
    </a>
</t>

получен правильный результат :

<a id="789">
  <b type="bar" value="12"/>
</a>
0 голосов
/ 05 марта 2009

Я думаю, что это будет: / b [@ type = 'foo' и @ value = 1] / parent :: a

0 голосов
/ 05 марта 2009
<xsl:variable name="nodeList" select="a[b[@type='foo' and @value=1]]"/>

<xsl:for-each select="$nodeList">
    <xsl:value-of select="."/>
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...