transformador test online mapeo generate from desde curso crear xml xslt

xml - test - xslt editor



XSLT: la mejor forma de dividir y representar texto separado por comas como HTML (3)

Tengo algunos datos en un elemento XML que se ve así:

<item value="category1,category2">Item Name</item>

El bit que me interesa es el atributo de valor . Puedo obtener los datos contenidos en este atributo en una plantilla que se ve así:

<xsl:template name="RenderValues"> <xsl:param name="ValueList" /> <xsl:value-of select="$ValueList" /> <!-- outputs category1,category2--> </xsl:template>

Lo que quiero hacer es procesar los valores separados por comas de una manera eficiente. ¿Cuál es la mejor manera de mostrar algo como lo siguiente desde dentro de la plantilla RenderValues?

<a href="x.asp?item=category1">category1</a> <a href="x.asp?item=category2">category2</a>


Es una pregunta legítima, y ​​las respuestas proporcionadas son buenas. Pero si está utilizando XSLT 1.0 y no puede usar funciones de extensión, simplemente no es posible. Las plantillas XSLT producen fragmentos de árbol de resultados, y XSLT solo puede funcionar en conjuntos de nodos. Tokenizar en XSLT requiere recursión, lo que significa llamar a una plantilla, lo que significa producir una estructura de datos que no puede procesar.

Si esta limitación se aplica a usted, y realmente, incluso si no lo hace, debe, si es posible, resolver este problema buscando a la persona que genera el XML cuyo contenido debe ser analizado nuevamente después de que el DOM lo haya analizado y procesado. o su parada. Poner múltiples valores en un atributo es simplemente incorrecto.


Está buscando la función tokenize :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:str="http://exslt.org/common"> <xsl:template match="/"> <xsl:variable name="sampleString">XML,XSLT,XPath,SVG,XPointer</xsl:variable> <xsl:for-each select="str:tokenize($sampleString,'','')"> <a> <xsl:attribute name="href"> <xsl:value-of select="str:concat(''x.asp?item='', .)" /> </xsl:attribute> <xsl:value-of select="."/> </a> </xsl:for-each> </xsl:template> </xsl:stylesheet>

http://www.xml.com/pub/a/2003/05/07/tr.html


En XSLT 2.0 / XPath 2.0 use la función estándar de XPath 2.0 tokenize () .

En XSLT 1.0 es necesario escribir una plantilla recursivamente llamada o, más convenientemente, utilizar la función / plantilla str-split-to-words de la biblioteca FXSL .

Aquí hay un ejemplo de esto último :

<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:variable name="vwordNodes"> <xsl:call-template name="str-split-to-words"> <xsl:with-param name="pStr" select="string(@value)"/> <xsl:with-param name="pDelimiters" select="'', &#10;''"/> </xsl:call-template> </xsl:variable> <!-- --> <xsl:apply-templates select="ext:node-set($vwordNodes)/*"/> </xsl:template> <!-- --> <xsl:template match="word" priority="10"> <a href="x.asp?item={.}"><xsl:value-of select="."/></a> </xsl:template> <!-- --> </xsl:stylesheet>

Cuando la transformación anterior se aplica en el documento XML proporcionado :

<item value="category1,category2">Item Name</item>

el resultado deseado es producido :

<a href="x.asp?item=category1" xmlns:ext="http://exslt.org/common">category1</a> <a href="x.asp?item=category2" xmlns:ext="http://exslt.org/common">category2</a>

El parámetro pDelimiters de esta plantilla permite especificar múltiples caracteres de delimitación. En el ejemplo anterior, cualquier carácter separador puede ser una coma, un espacio o un nuevo carácter de línea.