2010-08-03 22 views
7

Dar este tipo de archivo XML:Concatenate atributo de múltiples valores

<data> 
    <row val="3"/> 
    <row val="7"/> 
    <row val="2"/> 
    <row val="4"/> 
    <row val="3"/> 
</data> 

que necesito para recuperar la cadena '3; 7; 2; 4; 3' usando XPath 1.0 para que pueda crear enlaces dinámicos para la Servicio Google Chart en mi aplicación XForms.

¿Cómo puedo hacer eso? Es posible ?

Respuesta

8

XPath solución 2,0:

string-join(/data/row/@val,';') 

XSLT 1.0 solución:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="row"> 
     <xsl:value-of select="concat(substring(';',1,position()-1),@val)"/> 
    </xsl:template> 
</xsl:stylesheet> 

EDITAR: XSLT Short 1,0 solución.

+0

+1 para el truco 'concat()'. :-) – Tomalak

+0

La solución XSLT 1.0 no tiene sentido. 'position()' evalúa a 2, 4, 6, 8 y 10 con el ejemplo, ¿por qué está allí? Además, esto genera cada valor en una nueva línea y sangrado. – Stijn

1

No es posible en XPath (al menos, no en XPath 1.0, que supongo que es la versión que tiene).

mediante XSLT, esto sería fácil:

<xsl:template match="/data"> 
    <!-- select all rows for processing --> 
    <xsl:apply-templates select="row" /> 
</xsl:template> 

<!-- rows are turned into CSV of their @val attributes --> 
<xsl:template match="row"> 
    <xsl:value-of select="@val" /> 
    <xsl:if test="position() &lt; last()"> 
    <xsl:text>;</xsl:text> 
    </xsl:if> 
</xsl:template> 

XPath es un lenguaje de selección, no un lenguaje de procesamiento. Puede procesar los nodos en cualquier otro lenguaje de programación que ofrezca compatibilidad con XML y XPath; XSLT es solo una de las opciones.