Может ли 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, который возвращает, что "корзина" содержит "красный" и "синий"?
Решение
Если вы используете 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/ведро[/root/база/палатка[@key = current()/палатка/@key]/@color = 'синий' или /root/база/палатка[@key = current()/палатка/@key]/@color = 'красный']
У JeniT есть соответствующий ответ / код, указанный здесь.Вам нужно создать ключ перед переходом к XML-документу, а затем выполнить сопоставление с этим ключом.