如何使用XSLT根据之前的兄弟包装一组相邻元素?

时间:2015-07-14 12:57:40

标签: xml xslt dita

我想要包装所有附录元素,但前提是第一个附录元素的兄弟姐妹是其中的一部分。

所以如果输入就像

那样
<part>
..
..
</part>
<appendix href="..">
</appendix>
<appendix href="..">
</appendix>

然后输出就像

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

我对XSLT很新。所以我所尝试的一切都失败到现在为止。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用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>