Может ли 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, который возвращает, что "ведро" содержит "красный" и "синий"?

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

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

/root/base/tent[/root/bucket/tent/@key = @key ]/@color

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

/ root / bucket [/root/base/ палатка [@key = current()/tent/@key]/@color = 'blue') или /root/base/ палатка [@key = current () / палатка /@key]/@color = 'red']

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

Другие вопросы по тегам