Применение значений по умолчанию, если узел не существует - PullRequest
3 голосов
/ 01 марта 2012

В настоящее время я использую эту конструкцию для назначения значений по умолчанию, если узел не существует в предоставленном документе XML. Есть ли более краткий способ излагать то же самое?

<xsl:choose>
  <xsl:when test="var_name"><xsl:value-of select="var_name"/></xsl:when>
  <xsl:otherwise>default</xsl:otherwise>
</xsl:choose>

1 Ответ

2 голосов
/ 01 марта 2012

I.XPath 2.0

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

concat($yourVar, 'default'[not($yourVar)])

Вот полное преобразование XSLT 2.0 :

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="yourVar" select="'something'"/>
 <xsl:variable name="yourVar2" select="''"/>

 <xsl:template match="/">
  <xsl:sequence select="concat($yourVar, 'default'[not($yourVar)])"/>
  <xsl:text>&#xA;</xsl:text>
  <xsl:sequence select="concat($yourVar2, 'default'[not($yourVar2)])"/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к любому документу XML (не используется), необходимые строки создаются и выводятся для обеих переменных :

something
default

II.XPath 1.0

Использовать :

concat($yourNodeExpr, 
       substring('default', 1 + 7*boolean($yourNodeExpr)))

Это создает строковое значение $yourNodeExpr, если оно содержит хотя бы один узел, в противном случае это создает строку"default".

Объяснение :

Мы используем тот факт, что:

В XPath 1.0 всякий раз, когда логическое значение является операндом арифметического оператораэто значение преобразуется в число: number(false()) = 0 и number(true()) = 1.Таким образом, если boolean($yourNodeExpr) равно true(), второй аргумент равен substring above will become 1 + 7 = 8`, а подстрока будет пустой строкой.

С другой стороны, если boolean($yourNodeExpr) равно false(), второй аргумент substring() - 1+0 = 1, а подстрока - строка "default"

Более общее выражение :

concat(substring($val1, 1 div $cond1),
       substring($val1, 1 div $cond2)
       )

Предполагая, чтодва условия $cond1 и $cond2 являются взаимоисключающими (($cond1 and $cond2) = false() и ($cond1 or $cond2) = true()), а затем приведенное выше выражение создает строку $val1, когда $cond1 равно true()и выдает строку $val2, когда $cond2 равно true().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...