2012-07-28 27 views
6

Tôi đã tự hỏi nếu nó có thể sử dụng analyze-string và đặt nhiều nhóm trong RegEx và sau đó lưu trữ tất cả các nhóm phù hợp trong biến để sử dụng sau này.XSL Analyze-String -> Matching-Substring thành nhiều biến

như vậy:

<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>  

này không thực sự làm việc, nhưng đó là loại điều tôi sau đó, tôi biết tôi có thể quấn analyze-string trong một biến, nhưng điều đó dường như ngớ ngẩn rằng đối với mỗi nhóm tôi phải xử lý RegEx, không phải là rất hiệu quả, tôi sẽ có thể xử lý regex một lần và lưu trữ tất cả các nhóm để sử dụng sau này.

Bất kỳ ý tưởng nào?

Trả lời

6

Vâng làm

<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> 

giúp đỡ? Bằng cách đó, bạn có một biến có tên là groups, là một chuỗi gồm các phần tử group có các ảnh chụp.

+0

Tôi làm cách nào để truy cập các giá trị đó sau? Tôi thường sử dụng $ varname Bạn có truy cập vào các mảng như mảng không? Tôi cần sử dụng các giá trị sau này Trong nếu thử nghiệm – TheStoneFox

+0

Bạn có thể truy cập '$ groups [1]/x',' $ groups [1]/y', '$ groups [2]/x',' $ groups [2 ]/y' và như vậy. Tất nhiên, bạn cũng có thể xử lý các yếu tố khác, ví dụ: '' hoặc các mẫu áp dụng, ví dụ: ''. –

+0

Điều này làm việc một điều trị, cảm ơn rất nhiều! – TheStoneFox

5

Chuyển đổi này cho thấy rằng xsl:analyze-string là không cần thiết để có được kết quả mong muốn - giải pháp đơn giản và chung chung hơn tồn tại.:

<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> 

khi áp dụng trên tài liệu XML này:

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

trong đó sản xuất các truy nã, chính xác kết quả:

123 4567 

Ở đây chúng ta không dựa vào hiểu biết RegEx (có thể được cung cấp dưới dạng tham số) và chuỗi - chúng tôi chỉ thay thế chuỗi bằng quảng cáo chuỗi giới hạn của các nhóm RegEx, sau đó chúng tôi mã hóa và mọi mục trong chuỗi được tạo bởi tokenize() có thể dễ dàng được gán cho một biến tương ứng.

Chúng tôi không phải tìm kết quả mong muốn được chôn trong một tạm thời. cây - chúng tôi chỉ nhận được tất cả trong một chuỗi kết quả.

+1

Rất hiệu quả. +1 – conciliator