XPath的接合的多个元件(XPath joining multiple elements)

2019-10-21 01:49发布

我正在寻找一种方式,以每两个元素结合在一起使用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])

Answer 1:

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

您想要您的结果序列包含一个项目的每个的class='1'的元件,该项目是该元素的级联和其下一个兄弟的值(匹配class='2' )。



Answer 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>

我有匹配任何开始元素或休息元素两个模板。 我用的是以下同辈轴去接下来的两个元素。 所述<xsl:text>元素是有强制断行。



Answer 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>


文章来源: XPath joining multiple elements