XSLT 中的条件变量选择
Posted
技术标签:
【中文标题】XSLT 中的条件变量选择【英文标题】:Conditional variable select in XSLT 【发布时间】:2013-10-08 23:51:26 【问题描述】:如果值是数字,我希望变量具有元素的值,但如果不是,那么我希望变量具有值0
。
换句话说,在 XSLT 中是否有以下的简单等价物?
var foobar = is_numeric(element value) ? element value : 0
或者你会怎么写?
<xsl:variable name="foobar" select=" ? " />
【问题讨论】:
【参考方案1】:XPath 1.0:
<xsl:variable name="foobar">
<xsl:choose>
<xsl:when test="number($value) = number($value)">
<xsl:value-of select="$value"/>
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
这个聪明的 number($value) = number($value)
数字测试的参考:Dimitre Novatchev's answer 到 "Xpath test if is number" question。
【讨论】:
【参考方案2】:在 XPath 2.0 中是的,您可以使用“castable as
”
<xsl:variable name="foobar" as="xs:double"
select="if (x castable as xs:double) then x else 0" />
【讨论】:
【参考方案3】:你可以使用:
<xsl:variable name="x"
select="(ELEMENT[. castable as xs:double], 0)[1]"/>
或
<xsl:variable name="x"
select="sum(ELEMENT[. castable as xs:double])"/>
【讨论】:
(x, y)
在您的第一个示例中做了什么?
@Svish, (x, y)
形成了一个由x
和y
组成的序列,但是如果ELEMENT[. castable as xs:double]
的内容不是一个双精度值,那么ELEMENT[. castable as xs:double]
会产生一个空序列。 (ELEMENT, 0)
的序列或简单的序列 (0)
。然后谓词[1]
选择ELEMENT
或0
。
@Svish 所以特别是如果在当前上下文中有多个 ELEMENT
孩子,那么我的方法将始终返回 0
(因为多个项目的序列不是 castable as xs:double
),而 Michael 的方法将返回第一个 ELEMENT
子节点,该子节点可以转换为 xs:double
(在 (x, y)[1]
情况下)或所有此类 ELEMENT
s 的总和(在 sum()
情况下),或 @ 987654342@ 如果它们都不能适当地转换。
酷,感谢您的解释。我要去@IanRoberts,因为它最清楚地表达了我真正想要的东西。似乎不那么骇人听闻了,呵呵。以上是关于XSLT 中的条件变量选择的主要内容,如果未能解决你的问题,请参考以下文章