Как узнать, что переменная имеет значение или нет в XSLT - PullRequest
14 голосов
/ 18 ноября 2010

Я создаю XSLT-файл.У меня есть одна переменная, которая принимает значение из XML-файла. Но может случиться так, что в xml нет ссылки на значение, и в это время переменная XSL вернет значение False / None (не знаю). Я хочу сохранить условие, например, еслидля переменной нет значения, используйте значение по умолчанию.Как это сделать ?

Ответы [ 5 ]

26 голосов
/ 18 ноября 2010

С учетом нескольких деталей, приведенных в вопросе, самый простой тест, который вы можете сделать, это:

<xsl:if test="$var">
    ...
</xsl:if>

Или вы можете использовать xsl:choose, если хотите предоставить вывод для остального случая:

<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.

15 голосов
/ 18 ноября 2010

Вы не объяснили, что вы подразумеваете под "не имеет значения". Вот общее решение :

not($v) and not(string($v))

Это выражение оценивается как true() если $v "не имеет значения".

Оба условия должны быть выполнены , потому что строка $v, определенная как '0', имеет значение, но not($v) равно true().

В XSLT 1.0 использование значения по умолчанию может быть достигнуто различными способами, если «значение» является набором узлов или если значение является скалярным (например, строка, число или логическое значение).

@ Алехандро предоставил один способ получить значение по умолчанию, если переменная, которая должна содержать набор узлов, пуста.

Если переменная должна содержать скаляр, то следующее выражение возвращает свое значение (если оно имеет значение) или (иным образом) желаемое значение по умолчанию:

concat($v, substring($default, 1 div (not($v) and not(string($v)))))
4 голосов
/ 22 мая 2017

Вы можете использовать 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 тоже.

0 голосов
/ 08 декабря 2015

Я пробовал много решений от SO, мое последнее решение было взято из @ dimitre-novatchev, но это тоже не всегда работало. Недавно я нашел еще одно решение из случайного поиска Google, поделился с сообществом.

Чтобы проверить пустое значение переменной, мы можем объявить пустую переменную и сравнить ее значение с условием теста. Вот фрагмент кода:

<xsl:variable name="empty_string"/>
<xsl:if test="testVariableValue != $empty_string">
...
</xsl:if>

Здесь testVariableValue содержит значение новой переменной, которая будет проверена на пустое сценарий. Надеюсь, это поможет проверить состояние пустой переменной.

0 голосов
/ 18 ноября 2010

Во-первых, все переменные имеют значения, потому что XSLT принадлежит декларативной парадигме: инструкции по присваиванию нет, но когда вы объявляете переменную, вы также объявляете выражение для ее отношения значения.

Если это значение является типом данных набора узлов (что видно из вашего вопроса), то вам следует проверить наличие пустого набора узлов в случае, если ничего не было выбрано. Действительное логическое значение для пустого набора узлов - false. Итак, как ответил @ 0xA3 : test="$node-set".

Вы писали:

Если для переменной нет значения используйте по умолчанию. Как это сделать?

Ну, это зависит от того, какой тип данных вы ищете.

Предположим, тип данных набора узлов: если вам нужно значение $ node-set-1 или $ node-set-2, если $ node-set-1 пуст, то используйте:

$node-set-1|$node-set-2[not($node-set-1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...