Может ли XPath выполнять поиск по внешнему ключу в двух поддеревьях XML?

Скажем, у меня есть следующий XML...

<root>
  <base>
    <tent key="1" color="red"/>
    <tent key="2" color="yellow"/>
    <tent key="3" color="blue"/>
  </base>
  <bucket>
    <tent key="1"/>
    <tent key="3"/>
  </bucket>
</root>

... каким будет XPath, который возвращает, что «ведро» содержит «красный» и «синий»?


person dacracot    schedule 26.09.2008    source источник
comment
Выражение XPath в принятом в настоящее время ответе вообще не выбирает узлы корзины. Он выбирает атрибуты цвета. Так что этот ответ неверен. dacracot, пожалуйста, прими хороший ответ Джени   -  person Dimitre Novatchev    schedule 22.11.2008


Ответы (4)


Если вы используете XSLT, я бы рекомендовал настроить ключ:

<xsl:key name="tents" match="base/tent" use="@key" />

Затем вы можете получить <tent> в пределах <base> с определенным key, используя

key('tents', $id)

Тогда вы можете сделать

key('tents', /root/bucket/tent/@key)/@color

или, если $bucket является конкретным элементом <bucket>,

key('tents', $bucket/tent/@key)/@color
person JeniT    schedule 27.09.2008

Я думаю, это сработает:

/root/base/tent[/root/bucket/tent/@key = @key ]/@color
person Garth Gilmour    schedule 26.09.2008
comment
xpath работает для данного XML, но не является универсальным решением. Если XML: ‹root› ... snip ... ‹bucket› ‹tent key=1 /› ‹tent key=3 /› ‹/bucket› ‹bucket› ‹tent key=2 /› ‹/bucket› ‹/root›, то он вернет все три цвета. - person Sixto Saez; 27.09.2008
comment
Это выражение XPath вообще не выбирает узлы корзины. Он выбирает атрибуты цвета. Так что этот ответ неверен. dacracot, пожалуйста, прими хороший ответ Джени. - person Dimitre Novatchev; 22.11.2008

Это некрасиво. Как и при любом поиске, вам нужно использовать current():

/root/bucket[/root/base/tent[@key = current()/tent/@key]/@color = 'синий' или /root/base/tent[@key = current()/tent/@key ]/@color = 'красный']

person Robert Rossney    schedule 27.09.2008

У JeniT есть соответствующий ответ/код, указанный здесь. Вам нужно создать ключ перед просмотром документа XML, а затем выполнить сопоставление с этим ключом.

person David Robbins    schedule 29.09.2008