如何用XSLT的for-each-group与group-starting-with实现ques及后续p节点分组?
问题需求
将<ques>元素及其紧随的所有同级<p>元素包裹到<group>元素中。
输入XML
<root> <title>Title</title> <p>para</p> <ques>Ques</ques> <p>aaaa</p> <fig>aaa</fig> <box>box</box> <ques>Ques</ques> <p>aaaa</p> <p>bbbb</p> </root>
当前XSLT问题
你当前的代码用group-starting-with="ques"会把每个<ques>到下一个<ques>之间的所有元素(包括<fig>、<box>这类非<p>元素)都归入同一组,无法满足只包裹<ques>和紧随的同级<p>的需求。
修正后的XSLT代码
<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/> <xsl:template match="root"> <xsl:copy> <!-- 按节点是否为ques或紧随ques/p的p进行相邻分组 --> <xsl:for-each-group select="*" group-adjacent="boolean(self::ques or (self::p and preceding-sibling::*[1][self::ques or self::p]))"> <xsl:choose> <!-- 属于ques+p连续组的元素,包裹到<group>中 --> <xsl:when test="current-grouping-key()"> <group> <xsl:copy-of select="current-group()"/> </group> </xsl:when> <!-- 其他元素原样输出 --> <xsl:otherwise> <xsl:copy-of select="current-group()"/> </xsl:otherwise> </xsl:choose> </xsl:for-each-group> </xsl:copy> </xsl:template>
期望输出
<root> <title>Title</title> <p>para</p> <group> <ques>Ques</ques> <p>aaaa</p> </group> <fig>aaa</fig> <box>box</box> <group> <ques>Ques</ques> <p>aaaa</p> <p>bbbb</p> </group> </root>
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

