XPath加入多个元素

时间:2014-09-27 14:33:34

标签: xpath concatenation

我正在寻找一种方法,使用XPath2.0将每两个元素连接在一起:

<item>
    <element class='1'>el1</element>
    <element class='2'>el2</element>
    <break>break</break>
    <element class='1'>el3</element>
    <element class='2'>el4</element>
    <break>break</break>
    <element class='1'>el5</element>
    <element class='2'>el6</element>
    <break>break</break>
    <element class='1'>el7</element>
    <element class='2'>el8</element>
</item>

我希望结果如下:

el1el2
el3el4
el5el6
el7el8

&#34;休息&#34;两个有意义的元素之间,还有一些类可以帮助,但我仍然无法完成它。

由于我不熟悉XPath,这是我到目前为止所能提出的,结果证明是错误的,因为连接需要至少两个参数......

//item/concat(element[preceding-sibling::break | following-sibling::break])

3 个答案:

答案 0 :(得分:2)

//item/element[@class='1']/concat(., following-sibling::element[1])

您希望结果序列包含每个class='1'元素的一个项目,该项目的值是该元素与其下一个兄弟(匹配class='2')的串联。

答案 1 :(得分:1)

我不确定您是否也开放了XSLT 1.0解决方案,但这对我的输入xml有用:

  <xsl:template match="/item">
     <xsl:apply-templates select="element[1]|break"/> 
  </xsl:template>

  <xsl:template match="element[1]">
    <xsl:text>
</xsl:text>
    <xsl:value-of select="."/>
    <xsl:value-of select="following-sibling::*[1]"/>
  </xsl:template>

  <xsl:template match="break">
    <xsl:text>
</xsl:text>
    <xsl:value-of select="following-sibling::*[1]"/>
    <xsl:value-of select="following-sibling::*[2]"/>
  </xsl:template>

我有两个匹配start元素或break元素的模板。我使用following-sibling axis来获得接下来的两个元素。 <xsl:text>元素可以强制换行。

答案 2 :(得分:1)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

   <xsl:output omit-xml-declaration="yes"/>

   <xsl:template match="item">
      <xsl:for-each-group select="*" group-starting-with="break">
         <xsl:if test="current-group()[1][self::break]">
            <xsl:text>&#13;&#10;</xsl:text>
         </xsl:if>
         <xsl:value-of select="current-group()[self::element]" separator=""/>
      </xsl:for-each-group>
   </xsl:template>

</xsl:stylesheet>