Как я могу проверить, является ли значение пустым или пустым в XSL ?
Например, если categoryName
пусто? Я использую при выборе конструкции.
Например:
<xsl:choose>
<xsl:when test="categoryName !=null">
<xsl:value-of select="categoryName " />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="other" />
</xsl:otherwise>
</xsl:choose>
xsl:when
для тестов узлов. Посмотрим<xsl:template match="Category[categoryName[not(node())]]">...
вместе с собой<xsl:template match="Category">...
. Затем процессор примет правильные решения за вас, и вам больше не нужно будет выписывать бизнес-логику во вложенныхxsl:choose
файлах. Во многих случаях использование соответствующих шаблонов облегчает написание таблиц стилей.Ответы:
Редактировать : Это охватывает наиболее вероятную интерпретацию, по моему мнению, «[не] нулевого или пустого», как следует из вопроса, включая его псевдокод и мой собственный ранний опыт работы с XSLT. Т.е. «что эквивалентно следующей Java?»:
Для получения более подробной информации, например, для четкого определения « ноль» или «пусто», см . Ответ Джонни ниже и / или «скрипку» XSLT, которую я адаптировал из этого ответа, которая включает опцию в комментарии Майкла Кея, а также шестую возможную интерпретацию.
источник
test="not(categoryName = '')"
. Предоставленный ответ вернет false, если элемент categoryName отсутствует, что в моей интерпретации вопроса делает его неправильным ответом.<xsl:for-each select="root/*[matches(name(.), 'grp')]">
чтобы его можно было использовать в VS2010?В отсутствие какой-либо другой информации, я предполагаю следующий XML:
Пример использования будет выглядеть следующим образом:
источник
</CategoryName>
? тесты на пустые строки не работают для этого</CategoryName>
, и в этом нет никакой необходимости.Из пустого элемента :
Чтобы проверить, является ли значение определенного узла пустым
Это зависит от того, что вы подразумеваете под пустым.
not(node())
not(string(.))
not(normalize-space(.))
not(node()[not(self::comment())])
источник
not(text())
. Альтернатива вашей второй пули тожеnot(.//text())
. Как показывает ваша последняя пуля: есть много способов рассмотреть «ничто»;).if ($mystring) then ... else ...
Что о?
источник
<categoryName> <!-- some comment --> </categoryName>
а в остальном нет значимого текста, он все равно оценивается какtrue
Первые два имеют дело со значением NULL, а вторые два имеют дело с пустой строкой.
источник
xsl:apply-templates
и подбирайте шаблоны, чтобы получить то, что вы хотите, гораздо проще.В некоторых случаях вам может понадобиться узнать, когда значение является конкретно нулевым, что особенно необходимо при использовании XML, сериализованного из объектов .NET. Хотя принятый ответ работает для этого, он также возвращает тот же результат, когда строка пуста или пуста, то есть '', поэтому вы не можете различить.
Таким образом, вы можете просто проверить атрибут.
Иногда необходимо знать точное состояние, и вы не можете просто проверить, создан ли экземпляр CategoryName, потому что, в отличие от, скажем, Javascript
Вернет true для нулевого элемента.
источник
Я знаю, что этот вопрос старый, но между всеми ответами мне не хватает одного, который является общим подходом для этого варианта использования при разработке XSLT.
Я представляю, что отсутствующий код из OP выглядит примерно так:
И что вход выглядит примерно так:
Т.е. я предполагаю, что может быть ноль, пустой, один или несколько
categoryName
элементов. Чтобы справиться со всеми этими случаями, использованиеxsl:choose
конструкций -style или, другими словами, обязательно, быстро становится беспорядочным (тем более, если элементы могут быть на разных уровнях!). Типичная идиома программирования в XSLT - использование шаблонов (отсюда и T в XSLT), что является декларативным программированием, а не императивом (вы не указываете процессору, что делать, вы просто указываете, что вы хотите выводить, если выполняются определенные условия). Для этого варианта использования это может выглядеть примерно так:Это работает (с любой версией XSLT), потому что первая выше имеет более высокий приоритет (у нее есть предикат). Второй шаблон сопоставления «проваливается», перехватывает все, что недопустимо. Третий затем заботится о
categoryName
правильном выводе значения.Обратите внимание , что в этом случае нет необходимости в особенности по сопрягать
categories
илиcategory
, потому что процессор будет автоматически обрабатывать все дети, если не сказать ему , в противном случае (в этом примере, второй и третий шаблон не дальнейший процесс детей, потому что нетxsl:apply-templates
в их).Этот подход легче расширить, чем императивный, поскольку он автоматически работает с несколькими категориями и может быть расширен для других элементов или исключений, просто добавив другой соответствующий шаблон. Программирование без if-веток .
Примечание:
null
в XML нет такой вещи . Существует xsi: nil , но он используется редко, особенно редко в нетипизированных сценариях без какой-либо схемы.источник
Вероятно, это самое простое выражение XPath (в принятом ответе содержится проверка на обратное, и оно будет длиннее, если его отменить):
Пояснение :
Аргументом
not()
функции выше являетсяfalse()
именно тот случай, когда отсутствуетcategoryName
дочерний элемент («ноль») элемента контекста или (единственный такой)categoryName
дочерний элемент имеет строковое значение - пустую строку.В XSLT 2.0 используйте :
Вот полный пример :
Когда это преобразование применяется к следующему документу XML:
желаемый, правильный результат :
При применении к этому документу XML :
или на этом:
или на этом
правильный результат получается :
Точно так же используйте это преобразование XSLT 1.0 :
Сделать примечание : никакие условия не используются вообще. Узнайте больше о важности избегания условных конструкций в этом хорошем курсе Pluralsight:
« Тактические шаблоны проектирования в .NET: поток управления »
источник
Если существует вероятность того, что элемент не существует в XML, я бы проверил, присутствует ли этот элемент и что длина строки больше нуля:
источник
categoryName
дает выражение XPath , когдаcategoryName
в текущем контексте нет дочерних элементов) определяется как пустая строка, поэтому это избыточно -string-length(categoryName)
равно нулю, еслиcategoryName
элементов нет .Если узел не имеет значения, доступного во входном XML, как показано ниже xpath,
Функция string () конвертирует в пустое значение. Так что это работает нормально:
источник
Как-то так у меня работает
Или наоборот:
Примечание. Если вы не проверяете нулевые значения или не обрабатываете нулевые значения, IE7 возвращает -2147483648 вместо NaN.
источник
Я на самом деле нашел, что лучше просто проверить длину строки, так как много раз поле не пусто, просто пусто
источник
По моему опыту лучший способ это:
источник
Используйте простой categoryName / text () Такой тест отлично работает,
<categoryName/>
а также<categoryName></categoryName>
.источник