Тестирование на атрибут XML - PullRequest
21 голосов
/ 07 апреля 2011

У меня есть кусок XML, например, так:

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

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

Дальний, который я пришел, с

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

bar

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

Ответы [ 4 ]

31 голосов
/ 07 апреля 2011

Это выберет 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 с содержимым в нем.

В качестве отступления, я бы избегал использования селектора "where ", // (не говоря уже о подстановочном знаке *), если вы не уверены, что это именно то, что вам нужно.// - все равно что заставить свою очень нетерпеливую собаку понюхать кусок ткани и сказать ему: «Принеси мне все, что пахнет вот так, где бы ты ни находил».Вы не поверите странному дерьму, которое он может решить вернуть.

14 голосов
/ 07 апреля 2011

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

Элементы с атрибутом @src, который является пустым(без строкового значения):

//*[@src[not(string())]]

Элементы, имеющие атрибут @src, который имеет значение (строковое значение):

//*[string(@src)]

С http://www.w3.org/TR/xpath/#section-String-Functions

Набор узлов преобразуется в строку, возвращая строковое значение узла в наборе узлов, который находится первым в порядке документов.Если набор узлов пуст, возвращается пустая строка.

From http://www.w3.org/TR/xpath/#function-boolean

Строка имеет значение true тогда и только тогда, когда ее длина не равна нулю.

4 голосов
/ 07 апреля 2011

Использование :

//*[@src and not(string-length(@src))]

Выбирает все элементы в документе XML, которые имеют атрибут src, строковое значение которого имеет длину ноль.

//*[@src and string-length(@src)]

Это выбирает все элементы в документе XML, которые имеют атрибут src, чье строковое значение имеет длину, не равную нулю.

//*[@src and string-length(normalize-space(@src))]

Это выбирает все элементы в документе XML, которые имеют src атрибут, строковое значение которого после исключения начального и конечного пробелов имеет длину, которая не равна нулю.

//[not(@src)]

Выбирает все элементы в документе XML, которые не имеют атрибута src.

4 голосов
/ 07 апреля 2011

/root/foo[string-length(@src)!=0] вернуть все foo элементы имеют непустое значение.

К сожалению /root/foo[string-length(@src)=0] указывает элементы, которые не имеют атрибута src , а также элементы имеют src атрибут, но пустой.

...