2010-08-03 25 views
7

Nadanie tego rodzaju pliku XML:Łączy stwardnienie atrybut wartości

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

muszę odzyskać napis „3, 7, 2, 4; 3” za pomocą XPath 1.0, dzięki czemu można tworzyć dynamiczne łącza dla Usługa Google Chart w mojej aplikacji XForms.

Jak mogę to zrobić? Czy to możliwe ?

Odpowiedz

8

XPath roztworu 2,0:

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

XSLT 1.0 Roztwór:

<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 Krótka XSLT 1,0 rozwiązaniem.

+0

+1 za sztuczkę 'concat()'. :-) – Tomalak

+0

Rozwiązanie XSLT 1.0 nie ma sensu. 'position()' ocenia na 2, 4, 6, 8 i 10 na przykładzie, dlaczego tak jest? Co więcej, wyprowadza każdą wartość w nowym wierszu i wcina. – Stijn

1

Niemożliwe w XPath (przynajmniej nie w XPath 1.0, który, jak sądzę, jest wersją, którą posiadasz).

Korzystanie XSLT, to byłoby proste:

<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 jest językiem wybór, a nie język przetwarzania. Możesz przetwarzać węzły w dowolnym innym języku programowania, który zapewnia obsługę XML i XPath - XSLT jest tylko jedną z opcji.

Powiązane problemy