2012-07-28 10 views
6

Mi chiedevo se è possibile utilizzare analyze-string e impostare più gruppi all'interno della RegEx e quindi memorizzare tutti i gruppi corrispondenti in variabili da utilizzare in seguito.XSL Analyze-String -> Matching-Substring in più variabili

in questo modo:

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

Questo in realtà non funziona, ma questo è il genere di cosa che sto dopo, so di poter avvolgere il analyze-string in una variabile, ma che sembra sciocco che per ogni gruppo devo elaborare il RegEx, non molto efficiente, dovrei essere in grado di elaborare la regex una volta e memorizzare tutti i gruppi per l'uso in seguito.

Qualche idea?

risposta

6

Bene fa

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

aiuto? In questo modo hai una variabile denominata groups che è una sequenza di elementi group con le acquisizioni.

+0

Come accederei a quei valori in seguito? Sono abituato a usare $ varname Accedete a quelli come gli array? Devo usare i valori più tardi in In se i test – TheStoneFox

+0

Puoi accedere a '$ gruppi [1]/x',' $ gruppi [1]/y', '$ gruppi [2]/x',' $ gruppi [2 ]/y' e così via. Naturalmente puoi anche elaborare ulteriormente gli elementi, ad es. '' or apply-templates, ad es. ''. –

+0

Questo funziona davvero bene, grazie mille! – TheStoneFox

5

Questa trasformazione mostra che xsl:analyze-string non è necessario per ottenere i risultati desiderati: esiste una soluzione più semplice e generica.:

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

se applicato su questo documento XML:

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

che produce il desiderato, risultato corretto:

123 4567 

Qui non ci basiamo sul conoscere il RegEx (può essere fornito come parametro) e la stringa - sostituiamo semplicemente la stringa con l'annuncio stringa elimitata dei gruppi RegEx, che vengono quindi tokenize e ogni elemento nella sequenza prodotta da tokenize() può essere facilmente assegnato a una variabile corrispondente.

Non dobbiamo trovare i risultati desiderati sepolti in una temperatura. albero - li otteniamo tutti in una sequenza di risultati.

+1

Molto efficiente, davvero. +1 – conciliator

Problemi correlati