Может ли XPath выполнить поиск внешнего ключа в двух поддеревьях XML? - PullRequest
4 голосов
/ 27 сентября 2008

Скажите, у меня есть следующий 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, который возвращает, что "bucket" содержит "red" и "blue"?

Ответы [ 4 ]

5 голосов
/ 28 сентября 2008

Если вы используете 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
2 голосов
/ 27 сентября 2008

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

/root/base/tent[/root/bucket/tent/@key = @key ]/@color
1 голос
/ 27 сентября 2008

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

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

0 голосов
/ 30 сентября 2008

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

...