XSLT:我们可以使用abs值吗?

时间:2010-02-03 09:28:34

标签: java xslt

我想知道在XLST中是否可以使用数学:abs(...)? 我在某个地方看到了它,但它不起作用。 我有类似的东西:

<tag>
  <xsl:value-of select="./product/blablaPath"/>
</tag>

我尝试过这样的事情:

<tag>
  <xsl:value-of select="math:abs(./product/blablaPath)"/>
</tag>

但不起作用。我正在使用java 1.6语言。

5 个答案:

答案 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 &gt;= 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)

math:abs未内置于XSLT或XPATH中。它是一个XSLT扩展,由您正在转换的运行时提供。

以下是关于.NET xslt extensions的文章。

这是一个for Java(Xalan)。