2010-08-03 6 views
7

gibt diese Art von XML-Datei:Concatenate mehrere Attributwerte

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

Ich brauche die Zeichenfolge abrufen '3; 7; 2; 4; 3' XPath 1.0 verwenden, so dass ich dynamische Links für das erstellen Google Chart-Dienst in meiner XForms-Anwendung.

Wie kann ich das tun? Ist es möglich ?

Antwort

8

XPath 2.0 Lösung:

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

XSLT 1.0 Lösung:

<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: Short XSLT 1.0 Lösung.

+0

+1 für die 'concat()' Trick. :-) – Tomalak

+0

Die XSLT 1.0 Lösung macht keinen Sinn. 'position()' ergibt 2, 4, 6, 8 und 10 mit dem Beispiel, warum ist es da? Außerdem wird jeder Wert in einer neuen Zeile ausgegeben und eingerückt. – Stijn

1

Nicht möglich in XPath (zumindest nicht in XPath 1.0, die vermutlich die Version ist, die Sie haben).

XSLT verwenden, dies wäre einfach:

<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 ist eine Auswahl der Sprache, keine Verarbeitungssprache. Sie können die Knoten in jeder anderen Programmiersprache bearbeiten, die XML- und XPath-Unterstützung bietet - XSLT ist nur eine der Optionen.