2011-01-31 74 views
1

在XSL中有像CONTAIN這樣的函數,如果我用simbol編號,如「123112'+:」那麼就不會接受它。XSLT:數字格式

更精確:

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

答案:

111111 
222222 

我堅持使用XSLT 1.0版本

+0

@Petras:你的問題不清楚。你是否想要選擇那些沒有像這種模式那樣的`Number`元素「###### +」? – 2011-01-31 16:32:49

+0

下襬。不(包含(數字,'+'))。或者模式更具體? – Flack 2011-01-31 16:37:40

+0

如果我們不僅有數字元素而不是不接受它。如果2020年,我們會採取,但如果2020+,我們不會。 – Petras 2011-01-31 16:40:59

回答

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 

引述規格:

布爾函數將其 參數轉換爲一個布爾值,如下所示:一個 n紅棕色爲真當且僅當它是 既不是正的或負零,也不 NaN的

0

請使用以下XPath選擇包含數字的所有節點。它會跳過帶有加號的那些。

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

應與XSLT 1.0

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> 

wante d,正確的結果產生

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

說明:所有Number元素至極表達:

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

not(.*.+1) 

true()由簡單模板規則過濾掉

只有在Number元素的字符串值canno不能轉換爲數字。在這種情況下,根據定義,.*.+1評估爲NaNboolean(NaN)false()

如果Number元素的字符串值可以被轉換爲數字$ NUM,則上面的表達式是等效於:

not($num*$num+1) 

$num*$num+1 >= 1用於任何數目$num,所以,boolean(.*.+1)在這種情況下是總是true()