2010-05-17 25 views
8

¿Cómo puedo recorrer una cadena separada por comas que estoy pasando como parámetro en XSLT 1.0? ExAnálisis de cadenas separadas por comas XSLT

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

necesito bucle de los parámetros UID y collectd por encima de los nodos dentro de cada uno de los UID en mi archivo XML

+0

buena pregunta (1). Vea mi respuesta para una solución que no involucre recursión explícita. –

Respuesta

3

Aquí hay una solución XSLT 1.0 que utiliza la plantilla str-split-to-words de FXSL.

Tenga en cuenta que esta plantilla permite dividir en múltiples delimitadores ( pasados ​​como parámetro una cadena separada), por lo que incluso 1,4 7;9 se dividirá sin ningún problema utilizando esta solución.

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

Cuando se aplica esta transformación en el siguiente documento XML:

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

el resultado deseado, se produce correcta:

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

Gracias. ¿Qué es la sintaxis para repetir este parámetro separado por comas? Intenté con la solución anterior, pero obtuve el error "No puedo encontrar el script o el objeto externo que implementa el prefijo" http://fxsl.sf.net/ '. " Creo que es posible que no haya descargado los archivos correctamente. Bueno, solo necesito hacer coincidir cada valor de identificación en este parámetro de cadena separado por comas con el ID de nodo XML y, si se encuentra coincidencia, recoger el texto de cada nodo para mostrarlo en XML de salida. Tenga en cuenta que tengo que hacer esto en XSLT 1.0. – contactkx

+0

@contactx: ¿Quiere decir que no puede ejecutar mi transformación? ¿Has descargado FXSL 1.x? El atributo 'href' de la instrucción' 'debe especificar la ruta completa o relativa a la plantilla en la biblioteca. –

19

vainilla XSLT 1.0 puede resolver este problema mediante la recursividad.

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

hay bibliotecas de extensión pre-construidos que pueden hacer tokenización cadena (EXSLT tiene una plantilla para que, por ejemplo), pero dudo que esto es realmente necesario en este caso.

+0

¿tiene una plantilla recursiva para 'string-join'? – n611x007

Cuestiones relacionadas