Учитывая этот упрощенный формат данных:
<a>
<b>
<c>C1</c>
<d>D1</d>
<e>E1</e>
<f>don't select this one</f>
</b>
<b>
<c>C2</c>
<d>D2</d>
<e>E1</e>
<g>don't select me</g>
</b>
<c>not this one</c>
<d>nor this one</d>
<e>definitely not this one</e>
</a>
Как бы вы выбрали все C
s, D
s иE
B
элементы s, которые являются дочерними элементами элементов?
По сути, что-то вроде:
a/b/(c|d|e)
В моей ситуации, вместо того , чтобы просто a/b/
, запрос , приводя к выбору тех C
, D
, E
узлы на самом деле довольно сложный , поэтому я хотел бы избежать этого:
a/b/c|a/b/d|a/b/e
Это возможно?
or
- это логический оператор, он работает с двумя логическими значениями. XPath , объединение оператор|
действует на двух наборах узлов. Они совершенно разные, и для каждого из них есть свои варианты использования. Использование|
может решить исходную проблему, но в результате становится более длинным, сложным и сложным для понимания выражения XPath. Более простое выражение в этом ответе, в котором используетсяor
оператор, создает желаемый набор узлов и может быть указано в атрибуте «select»<xsl:for-each>
операции XSLT. Просто попробуйте.local-name()
правильно только в том случае, если мы хотим выбрать все элементы с этим локальным именем, независимо от пространства имен, в котором находится элемент. Это очень редкий случай - в целом люди действительно заботятся о различиях между:kitchen:table
иsql:table
, или междуarchitecture:column
,sql:column
,array:column
,military:column
Вы можете избежать повторения с помощью проверки атрибутов:
Вопреки антагонистическому мнению Димитра, вышесказанное не является неправильным в вакууме, где OP не указал взаимодействие с пространствами имен.
self::
Ось имен ограничительным,local-name()
нет. Если намерение OP заключается в захватеc|d|e
независимо от пространства имен (что, я бы предположил, является даже вероятным сценарием, учитывая природу проблемы OR), то это «еще один ответ, который все еще имеет некоторые положительные голоса», что неверно.Вы не можете быть окончательным без определения, хотя я вполне счастлив удалить свой ответ как действительно неправильный, если ОП поясняет свой вопрос так, что я ошибаюсь.
источник
local-name()
, означает ли это, что теги будут соответствовать любому пространству имен? Если я используюself::
, с каким пространством имен оно должно совпадать? Как бы мне соответствовать толькоOhMy:c
?А почему бы и нет
a/b/(c|d|e)
? Я только что попробовал использовать библиотеку Saxon XML (красиво обернутую добротой Clojure), и, похоже, она работает.abc.xml
- это документ, описанный OP.источник
Не уверен, что это поможет, но с XSL я бы сделал что-то вроде:
и не выберет ли этот XPath все дочерние узлы B:
источник