2010-06-08 82 views
0

好吧,這一個已經把我拉上了牆...XSLT:正則表達式函數不起作用?

我有一個xslt函數應該根據國家來分割Zip +城市字符串中的Zip代碼部分。我無法讓它工作!這是我走到這一步:

  • zipandcity:「DK-2640哥本哈根SV」
  • <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/functions" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:function name="exslt:GetZip" as="xs:string"> 
        <xsl:param name="zipandcity" as="xs:string"/> 
        <xsl:param name="countrycode" as="xs:string"/> 
        <xsl:choose> 
         <xsl:when test="$countrycode='DK'"> 
          <xsl:analyze-string select="$zipandcity" regex="(\d{4}) ([A-Za-zÆØÅæøå]{3,24})"> 
           <xsl:matching-substring> 
            <xsl:value-of select="regex-group(1)"/> 
           </xsl:matching-substring> 
           <xsl:non-matching-substring>  
             <xsl:text>fail</xsl:text> 
           </xsl:non-matching-substring> 
          </xsl:analyze-string>    
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:text>error</xsl:text> 
         </xsl:otherwise> 
        </xsl:choose> 
    </xsl:function> 
    

    我上的源XML在下面的值傳遞給函數運行它

  • countrycode:「DK」

...將輸出'失敗'!

我覺得有什麼東西我誤解這裏...

回答

3

除了從直到XSLT 2.0和花括號必須被轉義(但反斜槓不能)的正則表達式才被支持的事實中,還有一個原因說明爲什麼該代碼不起作用:XSLT正則表達式隱式地錨定在兩端。鑑於串DK-2640 København SV,你的正則表達式只匹配2640 København,所以你需要「墊」它,使其消耗整個字符串:

regex=".*(\d{{4}}) ([A-Za-zÆØÅæøå]{{3,24}}).*" 

.*可能就足夠在這種情況下,但有時你必須要更具體。例如,如果有多個地方可以匹配\d{4},則可以在開始時使用\D*以確保第一個捕獲組匹配第一組數字。

+0

非常棒!至少丹麥郵政編碼確實是這樣做的。現在我將嘗試將您的建議用於其他國家。謝謝! – 2010-06-09 05:45:49

+0

感謝您的提示,爲瑞典和荷蘭等國家的郵政編碼找到了一些良好的工作正則表達式。再次感謝! – 2010-06-10 11:51:28

2

正則表達式僅支持XSLT 2.X - 不是在XSLT 1.0。

+0

斑點!我改變了代碼中的版本號(以及上面的代碼片段),但我仍然得到相同的結果! – 2010-06-09 05:41:05

+0

只需更改版本號就沒有幫助,您需要使用XSLT 2.0 *處理器*。 – 2010-06-09 12:41:57

+0

我正在使用Stylus Studio ... – 2010-06-10 11:49:49

3

正則表達式屬性被解析爲一個屬性值模板,因爲大括號具有特殊意義。如果這是事實的XSL 2.0樣式表,你需要他們加倍逃脫正則表達式屬性中的花括號:(\d{{4}}) ([A-Za-zÆØÅæøå]{{3,24}})

另外,您可以定義包含這樣的模式的變量:

<xsl:variable name="pattern">(\d{4}) ([A-Za-zÆØÅæøå]{3,24})</xsl:variable 
<xsl:analyze-string select="$zipandcity" regex="{$pattern}"> 
相關問題