2010-08-03 95 views
7

给予这种XML文件的:连接多个属性值

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

我需要检索字符串使用XPath 1.0,这样我可以创建用于动态链接“3; 3 7; 2;; 4”我的XForms应用程序中的Google Chart服务。

我该怎么做?可能吗 ?

回答

8

的XPath 2.0溶液:

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

XSLT 1.0溶液:

<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:短XSLT 1.0溶液。

+0

+1''concat()'技巧。 :-) – Tomalak 2010-08-04 09:11:18

+0

XSLT 1.0解决方案毫无意义。举例来说,“position()”计算为2,4,6,8和10,为什么它在那里?此外,这将输出每个值在一个新的行和缩进。 – Stijn 2015-02-13 08:55:00

1

不可能在XPath中(至少,不是在XPath 1.0中,我认为它是你的版本)。

使用XSLT,这将是很容易:

<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是选择语言,而不是一个处理语言。您可以使用任何其他提供XML和XPath支持的编程语言处理节点 - XSLT只是其中一个选项。