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>
</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()
.