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 转换从混合内容中删除 HTML 元素

如果标记不存在,则使用XSLT将XML标记添加到SOAP消息

使用 XSLT 为 XML 到 HTML 转换中的不同 <place> 标记添加超链接

XSLT 导出过滤器产生不必要的空 XML 标记

如何使用 XSLT 从 XML 中删除元素标记