Тестирование атрибута XML
У меня есть фрагмент XML, например:
<root>
<foo src=""/>
<foo src="bar"/>
<foo />
</root>
Я хочу знать, какие элементы имеют атрибут src, которые пусты и которые имеют значения.
Самый дальний я пришел с
$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml
bar
Хотя это не говорит мне, что третий foo не имеет атрибута.
Ответы
Ответ 1
Это выберет foos без атрибута src
.
/root/foo[not(@src)]
Для двух других задач я бы использовал сочетание выражений, обозначенных @TOUDIdel и @Dimitre Novatchev:
/root/foo[@src and string-length(@src)=0]
для foos с пустым src
и /root/foo[@src and string-length(@src)!=0]
для foos с src
с содержимым в нем.
В стороне, я бы не использовал селектор "везде", //
(не говоря уже о подстановочном знаке *
), если вы не уверены, что это именно то, что вам нужно. //
походит на то, чтобы заставить вашу очень нетерпеливую собаку нюхать кусок ткани и говорить ей: "Принесите мне все, что пахнет этим, где бы вы ни находились". Вы не поверите, что это странное дерьмо, которое он может решить вернуть.
Ответ 2
Я хочу знать, какие элементы имеют атрибут src, которые пусты и которые имеют значения.
Элементы, имеющие атрибут @src
, который пуст (без строкового значения):
//*[@src[not(string())]]
Элементы, имеющие атрибут @src
, который имеет значение (строковое значение):
//*[string(@src)]
От http://www.w3.org/TR/xpath/#section-String-Functions
A node -set преобразуется в строку, возвращая строковое значение node в node -set, которое является первым в порядке документа. Если node -set пуст, возвращается пустая строка.
От http://www.w3.org/TR/xpath/#function-boolean
Строка истинна тогда и только тогда, когда ее длина не равна нулю.
Ответ 3
/root/foo[string-length(@src)!=0]
вернуть все элементы foo непустым значением.
К сожалению, /root/foo[string-length(@src)=0]
указывает элементы, у которых нет атрибута src, а также элементы имеют атрибут src, но пустой.
Ответ 4
Использование
//*[@src and not(string-length(@src))]
Это выбирает все элементы в документе XML, у которых есть атрибут src
, строковое значение которого имеет длину 0.
//*[@src and string-length(@src)]
Это выбирает все элементы в документе XML, у которых есть атрибут src
, строковое значение которого имеет длину, которая не равна нулю.
//*[@src and string-length(normalize-space(@src))]
Это выбирает все элементы в документе XML, у которых есть атрибут src
, строковое значение которого после исключения начального и конечного пробелов имеет длину, которая не равна нулю.
//[not(@src)]
Это выбирает все элементы в документе XML, которые не имеют атрибута src
.