XSLT 将输出标记为数字
Posted
技术标签:
【中文标题】XSLT 将输出标记为数字【英文标题】:XSLT Tokenize output as numbers 【发布时间】:2015-07-25 11:16:42 【问题描述】:在以下代码中:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="input">
<xsl:variable name="n" select="tokenize(./text(),'[0-9]+([,.][0-9]+)?')"/>
<xsl:choose>
<xsl:when test="(($n[0]*$n[0]+$n[1]*$n[1])/(n[3]*($n[0]*$n[0]+$n[1]*$n[1])))>300">
Retina!
</xsl:when>
<xsl:otherwise>
Trash!
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
示例输入:
<input>1920 1400 0.425</input>
我使用tokenize
来匹配两个input
标签之间的一些数字。唯一的问题是生成的数字列表都被格式化为字符串,因此后面的代码中的数学运算失败了。
那么,有没有办法让标记器输出数字列表,或者在 XSLT 2.0 中是否有与 map
等效的方法?
注意:我使用的是 Saxon 处理器
【问题讨论】:
您能否发布一个输入示例,以便我们重现您的问题? @michael.hor257k 当然 考虑解释你想要实现什么,你想为你发布的输入创建哪个输出?您的代码没有向我解释这一点,因为$n[0]
在 XSLT/XPath 中没有意义,其中序列中的项目索引以 1
开头。并且要使用您的输入 1920 1400 0.425
获取数字序列,我只希望使用 tokenize(., '\s+')
,如果您使用与数字匹配的正则表达式作为第二个参数,则返回的序列包含数字之间的字符串。
【参考方案1】:
有没有办法让分词器输出数字列表
是的。例如,您可以这样做:
<xsl:variable name="n" select="for $i in tokenize($input, $pattern) return number($i)"/>
但请注意:
-
您的标记模式未返回预期值;
在 XPath 中,节点从 1 开始编号;
$n[0]
为空且任何
使用它的数值运算将产生NaN
。
【讨论】:
@BetaDecay php?不,那是 XSLT,它又使用 XPath。 不,不,我的意思是for $i in tokenize
@BetaDecay XSLT 处理器使用以 XSLT 语言编写的 XSLT 样式表。 XSLT 语言“旨在与 XPath 结合使用”。没有其他语言被识别(除非您的处理器支持它们作为扩展 - 例如,Saxon 将允许您从 Java 借用)。表达式 for $i in ... return ...
在 XPath 中 - 请参阅:w3.org/TR/xpath20/#id-for-expressions以上是关于XSLT 将输出标记为数字的主要内容,如果未能解决你的问题,请参考以下文章
用于将仅包含一个 <tr> 标记的 <table> 节点转换为仅 <div> 和 <span> 标记的 XSLT
如果标记不存在,则使用XSLT将XML标记添加到SOAP消息