<адрес1 /> Какое значение в адресе - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть оператор XSLT следующим образом:

<xsl:when test="address1 != ' '">

Мой входящий XML адрес узла выглядит следующим образом:

<address1/>

Узел существует, и оператор xsl иногда кажется работающим, но он не всегда работает, он дает мне противоречивые результаты. Я проверяю узел address1, и если это пробелы, то я проверяю узел address2, если это не пробелы, я перемещаю его в поле вывода address1, если вход address1 является пробелами. Наши клиенты очень непоследовательны при вводе адресов, и наш поставщик требует, чтобы адрес1 был действительным. Спасибо за любую помощь.

Ответы [ 5 ]

2 голосов
/ 13 сентября 2011

Проблема с проверкой по строке состоит в том, что вы фактически проверяете текст во всех потомках элемента, поэтому <foo><bar>test</bar></foo> не пройдёт тест foo = '', потому что текст test существует внутри дерева.

Более убедительный тест: address1[not(text()) and not(*)]

Это проходит только в том случае, если в элементе адреса нет ни текстовых, ни дочерних элементов.

0 голосов
/ 13 сентября 2011

Чтобы проверить, является ли строковое значение элемента непустым и не только пробелом, используйте :

string-length(normalize-space(address1)) > 0

Стандартная функция XPath normalize-space($s) принимает строку $s в качестве аргумента и возвращает другую строку, созданную из $s, в которой все начальные и конечные пробельные символы удаляются, а любая группа смежных промежуточных пробельных символов заменяетсяодиночный пробел.

Это означает, что результатом normalize-space() при применении к строке, содержащей только пробельные символы, будет пустая строка (имеющая string-length() из 0).

Вышеупомянутое выражение XPath проверяет, имеет ли результат применения функции normalize-space() к строковому значению address1 положительную (> 0) длину - это означает, что строковое значение address1 содержитхотя бы один непробельный символ.

0 голосов
/ 13 сентября 2011

Вы недостаточно рассказываете нам о своем коде, чтобы мы могли достоверно сказать вам, что с ним не так.Не будь таким сдержанным!Могут быть всевозможные проблемы, которые не очевидны из крошечного фрагмента, например, использование неправильного элемента контекста.

Однако один совет: избегайте оператора "! =" (Который появился в вашем примере).Обычно вы хотите not(author=''), а не author!=''.Они означают одно и то же, если существует ровно один авторский элемент, но имеют разное значение, если авторского элемента нет или их несколько.Выражение author!='' имеет значение true, если существует хотя бы один элемент author, значение которого не является пустой строкой;выражение not(author='') имеет значение true, если нет элемента author, значением которого является пустая строка.

0 голосов
/ 13 сентября 2011

У самозакрывающегося тега не должно быть содержимого, поэтому проверка на '' была бы правильным способом.Выполнение '[space]' означает, что тег на самом деле <address1>[space]</address1>, который больше не является самозакрывающимся.

0 голосов
/ 13 сентября 2011

Узел пуст.

Вы проверяете, не является ли он одним пробелом ' ', если это пустой узел, тест пройдёт успешно.

Чтобы проверить, что узелпусто, вы можете сделать это:

<xsl:when test="address1 = ''">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...