我想知道在XLST中是否可以使用math:abs(...)? 我在某处看到过,但它不起作用。 我有类似于:
<tag>
<xsl:value-of select="./product/blablaPath"/>
</tag>
我尝试做了以下操作:
<tag>
<xsl:value-of select="math:abs(./product/blablaPath)"/>
</tag>
但是无法工作。我使用的是Java 1.6语言。
我想知道在XLST中是否可以使用math:abs(...)? 我在某处看到过,但它不起作用。 我有类似于:
<tag>
<xsl:value-of select="./product/blablaPath"/>
</tag>
我尝试做了以下操作:
<tag>
<xsl:value-of select="math:abs(./product/blablaPath)"/>
</tag>
但是无法工作。我使用的是Java 1.6语言。
这里有一个单一的XPath表达式实现了abs()
函数:
($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>
<t>
<num>-3</num>
<num>0</num>
<num>5</num>
</t>
想要的、正确的结果(对每个数字使用abs())已经生成:
<t>
<num>3</num>
<num>0</num>
<num>5</num>
</t>
{((entry/transaction-total >= 0)*entry/transaction-total - not(entry/transaction-total >= 0)*entry/transaction-total) -sum(((entry/transaction-splits/item/amount >= 0)*entry/transaction-splits/item/amount - not(entry/transaction-splits/item/amount >= 0)*entry/transaction-splits/item/amount))}
- designermonkeyabs()
很简单。如果用纯 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>
一种非常简单的解决方案是使用XSL 1.0的translate函数。
<xsl:value-of select="translate($x, '-', '')/>
(2*($x >= 0) - 1)*$x
Using
2*(any-test-here)-1
is a good way to have +1 when test is true, and -1 when false.
math:abs
在 XSLT 或 XPATH 中不是内置的。它是一种 XSLT 扩展,由您正在转换的运行时提供。
这里有一篇关于 .NET xslt extensions 的文章。
这里还有一个 Java(Xalan)的扩展。
math:abs
将由您的 Java 代码作为 XSLT 扩展提供。阅读链接的文章以了解如何将其暴露给您的 XSLT。 - Oded