在xpath中连接多个节点值

43

我有一个看起来像这样的XML文档

<element1>
    <element2>
        <element3>    
            <element4>Hello</element4>
            <element5>World</element5>
        </element3>
        <element3>    
            <element4>Hello2</element4>
            <element5>World2</element5>
        </element3>
        <element3>    
            <element4>Hello3</element4>
            <element5>World3</element5>
        </element3>
    </element2>
</element1>

我试着使用XPath获取像这样的结果:

Hello.World
Hello2.World2
Hello3.World3

我下面使用了concat函数,但是我没有得到正确的结果。

Concat函数:

concat(/element1/element2/element3/element4/text(),".", /element1/element2/element3/element5/text())

我得到的结果:

Hello.World

我应该如何得到正确的结果?我正在使用带有Camel Spring DSL的XPath。

编辑:

也欢迎使用XQuery、XSLT和SPel解决方案。

编辑:

我尝试了string-join函数,但它没有起作用:

string-join函数:

string-join((/element1/element2/element3/element4/text(), /element1/element2/element3/element5/text()),".")

我得到的结果:

Hello.Hello2.Hello3.World.World2.World3

1
在XPath2.0中有string-join,看起来更适合那里。但是,在XSLT中怎么办?我会在这里使用它。 - hek2mgl
添加了 string-join 函数的编辑。还将 XSLT 添加到标签中,并请求解决方案。 - krishna2642
要理解为什么会得到这个结果:节点集通过返回在文档顺序中第一个节点的字符串值来转换为字符串。 - nwellnhof
6个回答

44

试试这个表达式...

string-join(//element3/(concat(element4/text(), '.', element5/text())), "&#10;")

7
如果您想要一系列的结果,更简洁的方法是使用 //element3/string-join(element4 | element5, "."),如果您必须得到单个字符串作为结果,则另一个公式为 string-join(//element3/string-join(element4 | element5, "."), "&#xa;"),在我看来这个公式更易读。 - adamretter
+1 表示 //el/string-join(el2 | el3, 'separator')。我用这个来爬取图片并生成 CSV://img/string-join(@src | @alt | @width | @height, '|') - Timmah
小心使用 //element3/string-join(element4 | element5, ".")。无论您给出的顺序是 element4 还是 element5,并集操作符 | 都会维持 _文档顺序_!这意味着对于相同的输入文档,//element3/string-join(element5 | element4, ".") 将产生与 //element3/string-join(element4 | element5, ".") 相同的结果。我通常想要控制顺序,所以更喜欢使用形式为 //element3/string-join((element4, element5), ".") 的列表项。 - Garret Wilson

23

我使用了concat方法,效果很好。

concat(//SomeElement/text(),'_',//OtherElement/text())

16

这里有一个使用 XSLT 的解决方案:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//element3">
    <xsl:value-of select="element4/text()" />.<xsl:value-of select="element5/text()" />
</xsl:template>
</xsl:stylesheet>

5
为什么要对这个进行踩?请注意,string-join() 仅适用于 XPath2.0。这就是我建议使用 XSLT 的原因。 - hek2mgl

2

对于$doc/element2/element3中的$d,在fn:data($d/element())中返回字符串连接(".").
$doc存储了Xml.


1
如果您需要合并xpath选择的文本节点,但无法使用string-join(当您被限制在XSL 1.0时),这可能会有所帮助:
<xsl:variable name="x">
    <xsl:apply-templates select="..." mode="string-join-mode"/>
</xsl:variable>
joined and normalized: <xsl:value-of select="normalize-space($x)"/>

<xsl:template match="*" mode="string-join-mode">
    <xsl:apply-templates mode="string-join-mode"/>
</xsl:template>    

<xsl:template match="text()" mode="string-join-mode">
    <xsl:value-of select="."/>
</xsl:template>    

-1
<xsl:template match="element3">
        <xsl:value-of select="element4,element5" separator="."/>
    </xsl:template>

2
仅仅发布代码并不是一个好的回答。如果您还没有阅读,请阅读此如何回答 - thewaywewere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接