Я создаю файл XSLT. У меня есть одна переменная, которая принимает значение из файла XML. Но может случиться так, что в xml нет значения для значения, и в это время переменная XSL вернет False/None (не знаю). Я хочу сохранить условие вроде: If для переменной не используется значение по умолчанию. Как это сделать?
Как узнать переменную имеет значение или нет в XSLT
Ответ 1
С учетом нескольких деталей, заданных в вопросе, самый простой тест, который вы можете сделать, это:
<xsl:if test="$var">
...
</xsl:if>
Или вы можете использовать xsl:choose
, если вы хотите предоставить вывод для else-case:
<xsl:choose>
<xsl:when test="not($var)"> <!-- parameter has not been supplied -->
</xsl:when>
<xsl:otherwise> <!--parameter has been supplied --> </xsl:otherwise>
</xsl:choose>
Второй пример также корректно обрабатывает случай, когда переменная или параметр не были предоставлены с фактическим значением, то есть оно равно пустой строке. Это работает, потому что not('')
возвращает true
.
Ответ 2
Вы не объяснили, что вы подразумеваете под "не имеет значения". Вот общее решение:
not($v) and not(string($v))
Это выражение оценивается как true()
, если if $v
"не имеет значения".
Оба условия должны быть выполнены, поскольку строка $v
, определенная как '0'
, имеет значение, но not($v)
- true()
.
В XSLT 1.0 использование по умолчанию может быть достигнуто по-разному, если "значение" представляет собой набор node или если это значение является скаляром (например, строкой, числом или логическим).
@Alejandro предоставил один из способов получить значение по умолчанию, если переменная, которая должна содержать node -set, пуста.
Если переменная должна содержать скаляр, то следующее выражение возвращает свое значение (если оно имеет значение) или (в противном случае) желаемое значение по умолчанию:
concat($v, substring($default, 1 div (not($v) and not(string($v)))))
Ответ 3
Вы можете использовать string-length
для проверки, если, например, переменная с именем $reference
содержит что-либо.
<xsl:choose>
<xsl:when test="string-length($reference) > 0">
<xsl:value-of select="$reference" />
</xsl:when>
<xsl:otherwise>
<xsl:text>some default value</xsl:text>
</xsl:otherwise>
</xsl:choose>
При необходимости используйте normalize-space
.
Ответ 4
Во-первых, все переменные имеют значения, потому что XSLT принадлежит декларативной парадигме: нет инструкции asignation, но когда вы объявляете переменную, вы также объявляете выражение для его отношения значений.
Если это значение, a node установить тип данных (который выглядит из вашего вопроса), тогда вы должны проверить пустой набор node, если ничего не было выбрано. Эффективное логическое значение для пустого набора node ложно. Итак, поскольку @0xA3 ответил: test="$node-set"
.
Вы писали:
Если для переменной нет значения используйте значение по умолчанию. Как это сделать?
Ну, это зависит от того, какой тип данных вы ищете.
Предположим, что тип данных node: если вы хотите значение $node -set-1 или $node -set-2, если $node -set-1 пуст, используйте:
$node-set-1|$node-set-2[not($node-set-1)]
Ответ 5
Я пробовал много решений от SO, мое последнее решение было взято у @dimitre-novatchev, но это тоже не работает каждый раз. Недавно я нашел еще одно решение из случайного поиска Google, которое, как считается, делится с сообществом.
Чтобы проверить пустое значение переменной, мы можем объявить пустую переменную и сравнить ее значение с условием теста. Вот фрагмент кода:
<xsl:variable name="empty_string"/>
<xsl:if test="testVariableValue != $empty_string">
...
</xsl:if>
Здесь testVariableValue содержит значение новой переменной, подлежащей тестированию для пустых сценарий. Надеюсь, что это поможет проверить пустое состояние переменной.
Ответ 6
Попробовав несколько раз, я смог решить проблему.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://example.com" version="1.0" exclude-result-prefixes="ns" xmlns:func="http://exslt.org/functions">
<xsl:output method="text" omit-xml-declaration="yes" indent="no" encoding="UTF-8" media-type="application/json"/>
<xsl:template match="/">
<xsl:text>{</xsl:text>
<xsl:text>"abc": </xsl:text>
<xsl:variable name="givenDate" select="substring-before(//ns:RootElement/ns:givenDate, 'T')"/>
<xsl:value-of select="ns:set_value($givenDate)"/>
<xsl:text>}</xsl:text>
</xsl:template>
<xsl:function name="ns:set_value">
<xsl:param name="givenDate"/>
<xsl:choose>
<xsl:when test="$givenDate !=''">
<func:result>
<xsl:text>"</xsl:text>
<xsl:value-of select="$givenDate"/>
<xsl:text>"</xsl:text>
</func:result>
</xsl:when>
<xsl:otherwise>
<xsl:text>null</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
</xsl:stylesheet>