连接xpath中的多个节点值

问题描述 投票:0回答:6

我有一个如下所示的 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(/element1/element2/element3/element4/text(),".", /element1/element2/element3/element5/text())

我得到的结果:

Hello.World

怎样才能得到正确的结果? 我正在使用 XPath 和 Camel Spring DSL。

编辑:

XQuery、XSLT 和 SPel 中的解决方案也受到赞赏。

编辑

我尝试了字符串连接,但没有成功:

字符串连接函数:

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

我得到的结果:

Hello.Hello2.Hello3.World.World2.World3
xml xslt xpath xquery spring-el
6个回答
44
投票

试试这个表达方式...

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

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>

2
投票

使用

XQuery

for $d in $doc/element2/element3 return fn:string-join(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>
© www.soinside.com 2019 - 2024. All rights reserved.