Java XSLT:我们可以使用abs值吗?
我想知道在XLST中我们是否可以使用数学: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>
<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 >= 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标记中提出一个问题,并通过注释通知我。