XSLT:数字格式

时间:2011-01-31 16:23:51

标签: xslt

在XSL中,功能类似于CONTAIN,如果我的号码与“123112'+:”这样的simbol,则不接受它。

更确切地说:

<Number>111111</Number>
<Number>123123+</Number>
<Number>222222</Number>
<Number>222222+</Number>

答案:

111111
222222

我坚持使用xslt 1.0版

3 个答案:

答案 0 :(得分:0)

使用以下XPath选择包含数字的所有节点。它将跳过带有加号的那些。

Number[number(.)=number(.)]

应该使用XSLT 1.0

答案 1 :(得分:0)

另一种方法,利用数字进行布尔转换。

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:template match="/*">
        <xsl:apply-templates select="Number[boolean(number()) or . = 0]"/>
    </xsl:template>

    <xsl:template match="Number">
        <xsl:value-of select="."/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>

</xsl:stylesheet>

输入:

<Numbers>
    <Number>111111</Number>
    <Number>123123+</Number>
    <Number>222222</Number>
    <Number>222222+</Number>
</Numbers>

正确的结果:

111111
222222

引用规范:

  

布尔函数转换它的   布尔值的参数如下:a   当且仅当数字为真时,数字为真   既不是积极的也不是负的零   为NaN

答案 2 :(得分:0)

另一种解决方案:)

<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="Number[not(.*.+1)]"/>
</xsl:stylesheet>

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

<t>
    <Number>111111</Number>
    <Number>123123+</Number>
    <Number>222222</Number>
    <Number>222222+</Number>
</t>

产生了想要的正确结果

<t>
  <Number>111111</Number>
  <Number>222222</Number>
</t>

解释:表达式的所有Number元素:

not(.*.+1)

true()被简单模板规则过滤掉:

 <xsl:template match="Number[not(.*.+1)]"/>

仅当Number元素的字符串值无法转换为数字时,才可以执行此操作。在这种情况下,.*.+1根据定义评估为NaNboolean(NaN)false()

如果Number元素的字符串值可以转换为数字$ num,那么上面的表达式相当于:

not($num*$num+1)
对于任何数字$num*$num+1 >= 1

$num,因此,boolean(.*.+1)在这种情况下始终为true()