我想知道在XLST中是否可以使用数学:abs(...)? 我在某个地方看到了它,但它不起作用。 我有类似的东西:
<tag>
<xsl:value-of select="./product/blablaPath"/>
</tag>
我尝试过这样的事情:
<tag>
<xsl:value-of select="math:abs(./product/blablaPath)"/>
</tag>
但不起作用。我正在使用java 1.6语言。
答案 0 :(得分:7)
这是一个实现abs()
函数的单个XPath表达式:
($x >= 0)*$x - not($x >= 0)*$x
评估为 abs($x)
。
以下是此操作的简要演示:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:param name="x" select="."/>
<xsl:value-of select=
"($x >= 0)*$x - not($x >= 0)*$x"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档时:
<t>
<num>-3</num>
<num>0</num>
<num>5</num>
</t>
想要的,正确的结果(每个数字上的abs())生成:
<t>
<num>3</num>
<num>0</num>
<num>5</num>
</t>
答案 1 :(得分:3)
abs()
非常简单。在纯XSLT中实现它看起来像这样:
<xsl:template name="abs">
<xsl:param name="number">
<xsl:choose>
<xsl:when test="$number >= 0">
<xsl:value-of select="$number" />
<xsl:when>
<xsl:otherwise>
<xsl:value-of select="$number * -1" />
</xsl:otherwise>
</xsl:if>
</xsl:template>
在你的上下文中你会像这样调用它:
<tag>
<xsl:call-template name="abs">
<xsl:with-param name="number" select="number(product/blablaPath)" />
</xsl:call-template>
</tag>
答案 2 :(得分:1)
Anotherway:
(2*($x >= 0) - 1)*$x
当$ x为正时,测试返回“true”,因此2 * true-1返回1,因此最终结果为$ x。 当$ x为负数时,测试返回“false”,因此2 * false-1返回-1,因此最终结果为 - $ x。
当测试为真时,使用2*(any-test-here)-1
是获得 +1 的好方法, -1 当错误时。
答案 3 :(得分:1)
一个非常简单的解决方案是使用XSL 1.0转换功能。即
<xsl:value-of select="translate($x, '-', '')/>
答案 4 :(得分:0)