【问题标题】:XPath joining multiple elementsXPath 连接多个元素
【发布时间】:2014-09-27 14:33:33
【问题描述】:

我正在寻找一种使用 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

两个有意义的元素之间存在“中断”,还有一些类可以提供帮助,但我仍然无法完成。

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

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

【问题讨论】:

    标签: xpath concatenation


    【解决方案1】:
    //item/element[@class='1']/concat(., following-sibling::element[1])
    

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

    【讨论】:

      【解决方案2】:

      我不确定您是否也愿意接受 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 来获取接下来的两个元素。 &lt;xsl:text&gt; 元素用于强制换行。

      【讨论】:

        【解决方案3】:
        <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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-04
          • 2013-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多