2012-07-28 11 views
6

analyze-string'u kullanıp kullanamayacağımı ve RegEx içinde birden fazla grup ayarlayıp değiştiremeyeceğini merak ettim ve daha sonra kullanmak için tüm eşleşen grupları değişkenler halinde saklayın.XSL Analyze-String -> Birden çok değişkene eşleştirme-Substring

şöyle:

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

Bu aslında çalışmıyor, ama ben sonra ben bir değişkene analyze-string sarmak biliyorum ediyorum türden bir şey, ama bu her için o aptal görünüyor Grup RegEx'i çok verimli bir şekilde işlemem gerekiyor, düzenli ifadeyi bir kere işlemek ve daha sonra kullanmak için tüm grupları depolayabilmem gerekir.

Herhangi bir fikrin var mı?

cevap

6

Eh

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

yardımcı olmaktadır? Bu şekilde, groups isimli bir değişkeniniz vardır; bu, yakalamalara sahip group öğesinin bir dizisidir.

+0

Bu değerlere daha sonra nasıl erişirim? $ varname kullanıyorum Diziler gibi olanlara erişiyor musunuz? Değerleri daha sonra kullanmam gerekiyor Eğer testler – TheStoneFox

+0

ise $ grupları [1]/x', '$ gruplar [1]/y',' $ gruplar [2]/x', '$ groups [2] ]/y' vb. Tabii ki, ayrıca, örneğin, elemanları daha da işleyebilirsiniz. '' veya uygulama şablonları örn. ''. –

+0

Bu bir tedavi çalışması, çok teşekkürler! – TheStoneFox

5

Bu dönüştürme, istenen sonuçları elde etmek için xsl:analyze-string'un gerekli olmadığını gösterir - daha basit ve genel bir çözüm bulunur.: Burada

123 4567 

bilmenin güvenmeyin: aranan, doğru sonucu üretir

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

: Bu XML belgesi uygulanan

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

RegEx (parametre olarak temin edilebilir) ve dize - sadece dizeyle reklamı değiştiririz RegEx gruplarının, daha sonra belirlediğimiz ve tokenize() tarafından üretilen dizideki her öğenin, ilgili bir değişkene kolayca atanabilecekleri dizgisi.

İstenen sonuçları geçici olarak gömmek zorunda değiliz. ağaç - hepsini bir sonuç dizisinde elde ederiz.

+1

Gerçekten çok verimli. +1 – conciliator