2012-07-28 47 views
6

我想知道是否可以使用analyze-string並在RegEx中設置多個組,然後將所有匹配組存儲在變量中以供稍後使用。XSL分析字符串 - >匹配子字符串到多個變量

像這樣:

<xsl:analyze-string regex="^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee" select="."> 
    <xsl:matching-substring> 
    <xsl:variable name="varX"> 
     <xsl:value-of select="regex-group(1)"/> 
    </xsl:variable>         
    <xsl:variable name="varY"> 
     <xsl:value-of select="regex-group(2)"/> 
    </xsl:variable>   
    </xsl:matching-substring> 
</xsl:analyze-string>  

這並不實際工作,但是這是諸如此類的事情,我以後,我知道我可以在一個變量包住analyze-string,但似乎愚蠢的每一個我必須處理RegEx,效率不高,我應該能夠處理正則表達式並存儲所有組以備後用。

任何想法?

回答

6

以及是否

<xsl:variable name="groups" as="element(group)*"> 
<xsl:analyze-string regex="^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee" select="."> 
<xsl:matching-substring> 
    <group> 
    <x><xsl:value-of select="regex-group(1)"/></x> 
    <y><xsl:value-of select="regex-group(2)"/></y> 
    </group> 
</xsl:matching-substring> 
</xsl:analyze-string> 
</xsl:variable> 

幫助?這樣你有一個名爲groups的變量,這是一個group元素與捕獲序列。

+0

稍後我將如何訪問這些值? 我習慣了使用$ varname 你是否可以像數組一樣訪問這些數據?我需要稍後使用值如果測試 – TheStoneFox 2012-07-28 15:25:14

+0

您可以訪問'$ groups [1]/x','$ groups [1]/y','$ groups [2]/x','$ groups [2 ]/y'等等。你當然也可以進一步處理元素,例如''或apply-templates例如''。 – 2012-07-28 16:25:19

+0

這是一種享受,非常感謝! – TheStoneFox 2012-07-28 16:51:53

5

此轉換表明xsl:analyze-string不是獲得所需結果所必需的 - 存在一個更簡單和通用的解決方案。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="*[matches(., '^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee')]"> 

    <xsl:variable name="vTokens" select= 
     "tokenize(replace(., '^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee', '$1 $2'), ' ')"/> 

    <xsl:variable name="varX" select="$vTokens[1]"/> 
    <xsl:variable name="varY" select="$vTokens[2]"/> 

    <xsl:sequence select="$varX, $varY"/> 
</xsl:template> 
</xsl:stylesheet> 

當這個XML文檔施加:

<t>Blah 123 Bloo 4567 Blee</t> 

產生想要的,正確的結果

123 4567 

在這裏,我們不依靠知道RegEx(可以作爲參數提供)和字符串 - 我們只是用廣告替換字符串我們然後標記的RegEx組的字符串,並且由tokenize()生成的序列中的每個項目都可以很容易地分配給相應的變量。

我們不需要找到想要的結果埋在一個溫度。樹 - 我們只是把它們全部放入結果序列

+1

的確非常有效。 +1 – conciliator 2012-11-05 12:07:17