Может ли 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-документ, а затем выполните сопоставления с этим ключом.