Xml 如何使用XSLT根据以前的同级封装一组相邻元素?

Xml 如何使用XSLT根据以前的同级封装一组相邻元素?,xml,xslt,dita,Xml,Xslt,Dita,我想包装所有附录元素,但前提是第一个附录元素的前一个同级元素是其中的一部分 所以如果输入是 <part> .. .. </part> <appendix href=".."> </appendix> <appendix href=".."> </appendix> <part> .. .. </part> <appendices> <appendix href="..">

我想包装所有附录元素,但前提是第一个附录元素的前一个同级元素是其中的一部分

所以如果输入是

<part>
..
..
</part>
<appendix href="..">
</appendix>
<appendix href="..">
</appendix>
<part>
..
..
</part>
<appendices>
  <appendix href="..">
  </appendix>
  <appendix href="..">
  </appendix>
</appendices>
然后输出如下

<part>
..
..
</part>
<appendix href="..">
</appendix>
<appendix href="..">
</appendix>
<part>
..
..
</part>
<appendices>
  <appendix href="..">
  </appendix>
  <appendix href="..">
  </appendix>
</appendices>

我对XSLT相当陌生。所以我所做的一切都失败了。任何帮助都将不胜感激。

使用XSLT 2.0,您的口头描述将转换为

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

   <xsl:output indent="yes"/>

    <xsl:template match="*[appendix]">
        <xsl:copy>
            <xsl:for-each-group select="*" group-adjacent="boolean(self::appendix)">
                <xsl:choose>
                    <xsl:when test="current-grouping-key() and preceding-sibling::*[1][self::part]">
                        <appendices>
                            <xsl:apply-templates select="current-group()"/>
                        </appendices>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:apply-templates select="current-group()"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:transform>

请解释是否可以使用像Saxon 9这样的XSLT2.0处理器,因为在XSLT2.0中分组更容易。您还需要提供关于可能输入的更多详细信息,是否有不同类型的输入文档,一种类型具有您显示的结构,另一种类型具有您根本不想转换的不同结构?或者单个输入文档中有更多的元素吗?是的,我使用的是XSLT2.0和Saxon处理器。可以有两个输出。一个是上面所示的结构,另一个是没有,但有一个不需要处理的结构。此外,还有比上面提到的更多的元素。因此,使用会与另一个模板产生冲突,该模板以开头,用于降低文件中所有元素的大小写。很抱歉,我在问题中没有提到这一点,但还有其他模板与之冲突。有解决方法吗?如果您收到关于不明确规则匹配的警告,那么您需要为您希望具有优先级的模板应用优先级,例如…,对此表示抱歉,但这似乎对我不起作用。代码似乎正在运行,但我猜修改附录元素的少数其他模板之一正在出错@Martin HonnenWell如果您需要帮助将建议的代码集成到其他代码中,请编辑您的问题并呈现代码。接受此作为答案,因为此代码有效。只是需要根据我对集成的要求对它进行一些调整。非常感谢@Martin Honnen