2014-09-27 36 views
1

我正在尋找一種方式來每兩個元素結合在一起使用XPath2.0:的XPath加入多種元素

<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]) 

回答

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

您希望您的結果序列包含一個項目每個class='1'元素,該項目是該元素的級聯和其下一個兄弟(匹配class='2')的值。

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> 

我有匹配任何開始元素或休息元素兩個模板。我使用following-sibling axis來獲得接下來的兩個元素。 <xsl:text>元素在那裏強制換行。

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>