XSL层级调整:将para的后续list兄弟节点移入para内部
使用XSLT实现兄弟list节点移入前置para节点
实现方案
下面的XSLT可以精准处理你的需求:把para节点之后的所有同级list节点,移入该para的末尾,同时保留嵌套结构的合法性。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 默认复制模板:保留所有未特殊处理的节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配后续紧跟list节点的para,处理节点合并 --> <xsl:template match="para[following-sibling::*[1][self::list]]"> <xsl:copy> <!-- 复制para自身的属性和原有子内容 --> <xsl:apply-templates select="@*|node()"/> <!-- 抓取当前para之后所有连续的同级list节点 --> <xsl:apply-templates select="following-sibling::list[count(preceding-sibling::para[1]|current())=1]" mode="move"/> </xsl:copy> </xsl:template> <!-- 过滤已经被移入para的list节点,避免重复输出 --> <xsl:template match="list[preceding-sibling::*[1][self::para]]"/> <!-- 移动list节点时的复制模板 --> <xsl:template match="list" mode="move"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
关键逻辑说明
- 默认模板:确保XML中除了需要处理的
para和list外,其他所有节点(包括嵌套的para和list)都原样保留,符合DTD的嵌套规则。 - para匹配规则:只定位到后面直接跟着
list的para节点,避免误处理无关的para。 - 多list处理:通过
following-sibling::list[count(preceding-sibling::para[1]|current())=1]可以选中当前para之后所有连续的同级list节点,不管数量多少都能一次性移入。 - 去重处理:单独匹配已经被移入
para的list节点,不输出它们,防止重复内容。
内容的提问来源于stack exchange,提问作者ChrisR
相关产品推荐
相关产品推荐

