在XSL中,功能类似于CONTAIN,如果我的号码与“123112'+:”这样的simbol,则不接受它。
更确切地说:
<Number>111111</Number>
<Number>123123+</Number>
<Number>222222</Number>
<Number>222222+</Number>
答案:
111111
222222
我坚持使用xslt 1.0版
答案 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>
</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
根据定义评估为NaN
,boolean(NaN)
为false()
。
如果Number
元素的字符串值可以转换为数字$ num,那么上面的表达式相当于:
not($num*$num+1)
对于任何数字$num*$num+1 >= 1
,和$num
,因此,boolean(.*.+1)
在这种情况下始终为true()
。