2010-05-17 12 views
8

Come è possibile eseguire il ciclo di una stringa separata da virgola che sto passando come parametro in XSLT 1.0? Ex-Analisi stringa separata da virgola XSLT

<xsl:param name="UID">1,4,7,9</xsl:param> 

ho bisogno di ciclo i parametri UID e collectd nodi sopra dall'interno ciascuna delle UID nel mio file XML

+0

buona domanda (+1). Vedi la mia risposta per una soluzione che non prevede la ricorsione esplicita. –

risposta

3

Ecco una soluzione XSLT 1.0 che utilizza il modello str-split-to-words di FXSL.

Si noti che questo modello consente di dividere su più delimitatori (passato come stringa parametro a parte), quindi, anche 1,4 7;9 sarà diviso senza problemi con questa soluzione.

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" 
> 

    <xsl:import href="strSplit-to-Words.xsl"/> 

    <xsl:output indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="/"> 
     <xsl:call-template name="str-split-to-words"> 
     <xsl:with-param name="pStr" select="/"/> 
     <xsl:with-param name="pDelimiters" 
         select="', ;&#9;&#10;&#13;'"/> 
     </xsl:call-template> 
    </xsl:template> 
</xsl:stylesheet> 

Quando questa trasformazione viene applicata sul seguente documento XML:

<x>1,4,7,9</x> 

The Wanted, risultato corretto è prodotto:

<word>1</word> 
<word>4</word> 
<word>7</word> 
<word>9</word> 
+0

Grazie. Qual è la sintassi per eseguire il ciclo di questo parametro separato da virgola? Provato sopra la soluzione, ma ho ottenuto l'errore "Impossibile trovare lo script o l'oggetto esterno che implementa il prefisso 'http://fxsl.sf.net/". " Penso che potrebbe non aver scaricato i file correttamente. Bene, ho solo bisogno di abbinare ogni valore id in questo parametro stringa separato da virgole rispetto all'ID nodo XML e se la corrispondenza trovata raccoglie il testo di ogni nodo da visualizzare nell'XML di output. Si prega di notare che devo fare questo in XSLT 1.0. – contactkx

+0

@contactx: vuoi dire che non puoi eseguire la mia trasformazione? Hai scaricato FXSL 1.x? L'attributo 'href' dell''istruzione' 'dovrebbe specificare il percorso completo o relativo al modello nella libreria. –

19

Vanilla XSLT 1.0 in grado di risolvere questo problema ricorsione.

<xsl:template name="split"> 
    <xsl:param name="list"  select="''" /> 
    <xsl:param name="separator" select="','" /> 

    <xsl:if test="not($list = '' or $separator = '')"> 
    <xsl:variable name="head" select="substring-before(concat($list, $separator), $separator)" /> 
    <xsl:variable name="tail" select="substring-after($list, $separator)" /> 

    <!-- insert payload function here --> 

    <xsl:call-template name="split"> 
     <xsl:with-param name="list"  select="$tail" /> 
     <xsl:with-param name="separator" select="$separator" /> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

ci sono le librerie di estensione pre-costruiti che possono fare stringa tokenizzazione (EXSLT ha un modello per questo, per esempio), ma dubito che questo è davvero necessario qui.

+0

ti capita di avere un modello ricorsivo per 'string-join'? – n611x007

Problemi correlati