Подтвердить что ты не робот

Тестирование атрибута XML

У меня есть фрагмент XML, например:

<root>
    <foo src=""/>
    <foo src="bar"/>
    <foo />
</root>

Я хочу знать, какие элементы имеют атрибут src, которые пусты и которые имеют значения.

Самый дальний я пришел с

$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml 

bar

Хотя это не говорит мне, что третий foo не имеет атрибута.

4b9b3361

Ответ 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.