我正在寻找一种方法,使用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])
答案 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> </xsl:text>
</xsl:if>
<xsl:value-of select="current-group()[self::element]" separator=""/>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>