Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XSLT:我们可以使用abs值吗?_Java_Xslt - Fatal编程技术网

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

Java XSLT:我们可以使用abs值吗?,java,xslt,Java,Xslt,我想知道在XLST中我们是否可以使用数学:abs(…)? 我在某处看到过这个,但它不起作用。 我有点像: <tag> <xsl:value-of select="./product/blablaPath"/> </tag> <tag> <xsl:value-of select="math:abs(./product/blablaPath)"/> </tag> 我试着做一些类似的事情: <tag>

我想知道在XLST中我们是否可以使用数学:abs(…)? 我在某处看到过这个,但它不起作用。 我有点像:

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

我试着做一些类似的事情:

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


但是不起作用。我使用的是java 1.6语言。

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

这里有一篇关于

这里有一个(Xalan)。

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>

这里有一个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>

将此转换应用于以下XML文档时:

<t>
  <num>-3</num>
  <num>0</num>
  <num>5</num>
</t>

-3
0
5.
生成所需的正确结果(每个数字上的abs())

<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>

3.
0
5.
另一种方式:

(2*($x >= 0) - 1)*$x
当$x为正时,测试返回“true”,因此2*true-1返回1,因此最终结果为$x。 当$x为负时,测试返回“false”,因此2*false-1返回-1,因此最终结果为-x


当测试为真时使用+1,当测试为假时使用-1是一种很好的方法。一个非常简单的解决方案是使用XSL 1.0翻译函数。即

<xsl:value-of select="translate($x, '-', '')/>

我宁愿只修改xslt文件而不是java代码,因为java代码中有很多影响。太糟糕了<代码>数学:abs
将由java代码作为xslt扩展提供。阅读链接文章,了解如何将其公开给xslt.dup?看看我刚才添加的一行解决方案:)事实上,我找到了解决方案。有一个数学模型:abs实现。我刚刚使用了,在我的noed中,我把“math:abs(…)”放在了XSLT1.0上,因为您没有提到可以使用2.0版。请看我刚才添加的一行解决方案:)@tomalak实际上,这只是abs()的定义的1:1。如果$x>=0,则只需$x(乘以1),如果$x<0,则$x乘以-1。上述条件是互斥的,因此其中只有一个是真的(1),而只有一个是假的(0)。我们用它将两者相加,得到一个公式。@Dimitre:这正是处理字符串时所称的“贝克尔方法”。)请参阅бэΓ的博客:.@tomalak这是XPath 1.0将布尔值协同为数字的一个属性。它已经被广泛使用,不仅仅是O.B.这似乎对我不起作用,也许你可以展示一个使用它的例子。@James:我在回答中添加了一个完整的XSLT转换和一个XML文档,你可以将其复制/粘贴到你最喜欢的XSLT IDE中,然后运行转换。代码中没有“起作用”的是一些附加内容。如果您仍然存在任何类型的问题,请告诉我——最好在xslt标记中提出一个问题,并通过注释通知我。