【问题标题】:Concatenate multiple node values in xpath在 xpath 中连接多个节点值
【发布时间】:2014-03-26 15:48:49
【问题描述】:

我有一个看起来像这样的 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

【问题讨论】:

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

标签: xml xslt xpath xquery spring-el


【解决方案1】:

试试这个表达式...

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

【讨论】:

  • 如果你想要一个结果序列,更简洁的方法是使用//element3/string-join(element4 | element5, "."),如果你必须有一个字符串作为结果,string-join(//element3/string-join(element4 | element5, "."), "&amp;#xa;") 是另一种公式,恕我直言更具可读性。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这里有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>
    

    【讨论】:

    • 否决这个有什么意义?请注意,string-join() 仅适用于 XPath2.0。这就是为什么我建议使用 XSLT
    【解决方案4】:

    for $d in $doc/element2/element3 return fn:string-join(fn:data($d/element()), ".").
    $doc 存储 Xml。

    【讨论】:

      【解决方案5】:

      如果您需要加入 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>    
      

      【讨论】:

        【解决方案6】:
        <xsl:template match="element3">
                <xsl:value-of select="element4,element5" separator="."/>
            </xsl:template>
        

        【讨论】:

        • 仅仅发布代码不是一个好的答案。如果您还没有阅读,请阅读此how-to-answer
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多