XSLT:数字格式

XSLT:数字格式,xslt,Xslt,在XSL中,函数类似于CONTAIN,如果我有一个带有simbol的数字,比如123112'+:则不接受它 更准确地说: <Number>111111</Number> <Number>123123+</Number> <Number>222222</Number> <Number>222222+</Number> 我一直在使用XSLT1.0版本,请使用以下XPath选择包含数字的所有节点。它将跳过

在XSL中,函数类似于CONTAIN,如果我有一个带有simbol的数字,比如123112'+:则不接受它

更准确地说:

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

我一直在使用XSLT1.0版本,请使用以下XPath选择包含数字的所有节点。它将跳过那些带有加号的

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

应该与XSLT1.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>
引用规范:

布尔函数将其 布尔值的参数,如下所示:a 当且仅当数字为真时,数字才为真 既不是正零也不是负零 楠

另一个解决方案:

如果为true,则会被简单模板规则过滤掉:

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

对于任何数字,$num,$num*$num+1>=1,所以布尔值。*+1在这种情况下总是正确的。

@Petras:你的问题不清楚。是否要选择那些没有此图案+下摆值的数字元素。不包含成员“+”。或者模式更具体?如果我们没有唯一的数字元素,就不要接受它。如果是2020年,我们会接受,但如果是2020+年,我们不会。@Petras,对不起,我在翻译中迷失了方向。“如果我们没有唯一的数字元素,你能重新措辞吗?”亚历杭德罗。对不起。我的意思是,如果我们只有数字,那么我们就展示出来。如果我们有带符号的数字,如+,?例如:21231+,那么我们不会显示+1数字数据类型的正确语义实例。请注意,对于XPath1.0来说,Number[.=Number]已经足够了。在Xpath 2.0中,我们将使用operator的实例。我是否可以将此方法与select的值一起使用:@Alejandro-我没有考虑到收缩到.=number-这很有用。可悲的是,目前我在大部分工作中都使用XPath1.0。如果零是unsignifican@Flack:如果零位于小数点之前其他数字之前的左起始零组中,或者如果零位于小数点之后的右结束零组中,则零可能不重要。因此,数字0不是一个无关紧要的零。@Dimitre,是的,这是一个很弱的措辞。我的意思是,如果值为0的元素不重要。@Flack:那么您可以修复表达式:booleannumber或。=0@Dimitre. 是的,我只是觉得这很明显。现在修好了。
<Numbers>
    <Number>111111</Number>
    <Number>123123+</Number>
    <Number>222222</Number>
    <Number>222222+</Number>
</Numbers>
111111
222222
<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>
<t>
    <Number>111111</Number>
    <Number>123123+</Number>
    <Number>222222</Number>
    <Number>222222+</Number>
</t>
<t>
  <Number>111111</Number>
  <Number>222222</Number>
</t>
not(.*.+1)
 <xsl:template match="Number[not(.*.+1)]"/>
not($num*$num+1)