2010-08-03 9 views
7

Dare questo tipo di file XML:Concatenate attributo multiple Valori

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

ho bisogno di recuperare la stringa '3; 7; 2; 4; 3' utilizzando XPath 1.0 in modo che posso creare collegamenti dinamici per la Servizio di Google Chart nella mia applicazione XForms.

Come posso farlo? È possibile ?

risposta

8

XPath soluzione 2.0:

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

XSLT 1.0 soluzione:

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

EDIT: Corti XSLT 1.0 soluzione.

+0

+1 per il trucco 'concat()'. :-) – Tomalak

+0

La soluzione XSLT 1.0 non ha senso. 'position()' valuta a 2, 4, 6, 8 e 10 con l'esempio, perché è lì? Inoltre, questo produce ogni valore su una nuova riga e rientrato. – Stijn

1

Non possibile in XPath (almeno, non in XPath 1.0, che suppongo sia la versione in uso).

Usando XSLT, questo sarebbe facile:

<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 è un linguaggio di selezione, non un linguaggio di elaborazione. È possibile elaborare i nodi in qualsiasi altro linguaggio di programmazione che fornisca supporto XML e XPath: XSLT è solo una delle opzioni.