如何在XSLT-1.0中实现abs函数的绝对值计算功能
XSLT 1.0 实现绝对值功能的解决方案
XSLT 1.0 原生没有内置abs()函数,你可以通过以下两种方案实现完全等价的绝对值计算效果,支持整数、小数正负值转换,输入-1.5时可正确输出1.5:
方案1:单行内联表达式(直接替换原有代码)
利用XPath 1.0布尔值的算术运算特性(true运算时等价于1,false等价于0),直接写判断逻辑,替换你原有代码里的abs(salesPrice/ns2:BelopFelt)部分即可:
<xsl:value-of select="concat('-', number(salesPrice/ns2:BelopFelt) * (2*(salesPrice/ns2:BelopFelt >= 0) - 1))"/>
- 原理说明:
- 当目标值≥0时,
salesPrice/ns2:BelopFelt >=0返回true,等价于1,计算得2*1-1=1,目标值乘1返回原值 - 当目标值<0时,判断返回false等价于0,计算得
2*0-1=-1,目标值乘-1返回绝对值
- 当目标值≥0时,
方案2:可复用命名模板(适合多场景调用)
如果你的代码里多处需要计算绝对值,可以封装为通用命名模板,后续直接调用即可:
- 先在XSLT样式表的顶层定义模板:
<xsl:template name="abs"> <xsl:param name="inputValue" /> <xsl:choose> <xsl:when test="$inputValue >= 0"> <xsl:value-of select="$inputValue" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="$inputValue * -1" /> </xsl:otherwise> </xsl:choose> </xsl:template>
- 替换原有代码的abs部分,调用模板即可:
<xsl:value-of select="concat('-', '')"> <xsl:call-template name="abs"> <xsl:with-param name="inputValue" select="salesPrice/ns2:BelopFelt" /> </xsl:call-template> </xsl:value-of>
内容的提问来源于stack exchange,提问作者Shanka Somasiri
相关产品推荐
相关产品推荐

