XSLT 2.0 - 分组和排序 -<xsl:for-each-group>

XSLT 2.0 - Grouping and Sorting -<xsl:for-each-group>

我想按照 fnlabel 的顺序按 fnrtoken 将脚注组合在一起。 所有带有 fnrtoken 的都应该按标签顺序分组在一起。 但是,如果没有 fnlabel 的任何脚注在这些脚注之间,则应为该脚注创建新组,并再次开始新组以使用 fnlable

保留脚注

输入:

<endnotes>
    <footnote fntoken="aasdf" fnrtoken="78hyyj">
        <fnlabel>2</fnlabel>
        <para></para>
    </footnote>
    <footnote fntoken="aasdf" fnrtoken="78jjjj">
        <fnlabel>1</fnlabel>
        <para></para>
    </footnote>
    <footnote fntoken="aasdf" fnrtoken="7900hj">
        <fnlabel>4</fnlabel>
        <para></para>
    </footnote>
    <footnote fntoken="aasdf">
        <fnlabel>3</fnlabel>
        <para></para>
    </footnote>
    <footnote fntoken="aasdf">
        <fnlabel>5</fnlabel>
        <para></para>
    </footnote>
</endnotes>


Output:
<footenotegrp>
    <footnote fntoken="aasdf" fnrtoken="78jjjj">
        <fnlabel>1</fnlabel>
        <para></para>
    </footnote>
    <footnote fntoken="aasdf" fnrtoken="78hyyj">
        <fnlabel>2</fnlabel>
        <para></para>
    </footnote>
</footenotegrp>
<footenotegrp>
    <footnote fntoken="aasdf">
        <fnlabel>3</fnlabel>
        <para></para>
    </footnote>
</footenotegrp>
<footenotegrp>
    <footnote fntoken="aasdf" fnrtoken="7900hj">
        <fnlabel>4</fnlabel>
        <para></para>
    </footnote>
</footenotegrp>
<footenotegrp>
    <footnote fntoken="aasdf">
        <fnlabel>5</fnlabel>
        <para></para>
    </footnote>
</footenotegrp>

在我看来,您首先要排序,然后要使用 group-adjacent="exists(@fnrtoken)":

进行分组
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="/*">
        <root>
            <xsl:variable name="sorted" as="element(footnote)*">
                <xsl:perform-sort select="footnote">
                    <xsl:sort select="fnlabel"></xsl:sort>
                </xsl:perform-sort>
            </xsl:variable>
            <xsl:for-each-group select="$sorted" group-adjacent="exists(@fnrtoken)">
                <xsl:choose>
                    <xsl:when test="current-grouping-key()">
                        <footnotegrp>
                            <xsl:copy-of select="current-group()"/>
                        </footnotegrp>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:for-each select="current-group()">
                            <footnotegrp>
                                <xsl:copy-of select="."/>
                            </footnotegrp>
                        </xsl:for-each>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>
        </root>
    </xsl:template>

</xsl:stylesheet>

这改变了

<?xml version="1.0" encoding="UTF-8"?>
<endnotes>
    <footnote fntoken="aasdf" fnrtoken="78hyyj">
        <fnlabel>2</fnlabel>
        <para></para>
    </footnote>
    <footnote fntoken="aasdf" fnrtoken="78jjjj">
        <fnlabel>1</fnlabel>
        <para></para>
    </footnote>
    <footnote fntoken="aasdf" fnrtoken="7900hj">
        <fnlabel>4</fnlabel>
        <para></para>
    </footnote>
    <footnote fntoken="aasdf">
        <fnlabel>3</fnlabel>
        <para></para>
    </footnote>
    <footnote fntoken="aasdf">
        <fnlabel>5</fnlabel>
        <para></para>
    </footnote>
</endnotes>

进入

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <footnotegrp>
      <footnote fntoken="aasdf" fnrtoken="78jjjj">
               <fnlabel>1</fnlabel>
               <para/>
         </footnote>
      <footnote fntoken="aasdf" fnrtoken="78hyyj">
               <fnlabel>2</fnlabel>
               <para/>
         </footnote>
   </footnotegrp>
   <footnotegrp>
      <footnote fntoken="aasdf">
               <fnlabel>3</fnlabel>
               <para/>
         </footnote>
   </footnotegrp>
   <footnotegrp>
      <footnote fntoken="aasdf" fnrtoken="7900hj">
               <fnlabel>4</fnlabel>
               <para/>
         </footnote>
   </footnotegrp>
   <footnotegrp>
      <footnote fntoken="aasdf">
               <fnlabel>5</fnlabel>
               <para/>
         </footnote>
   </footnotegrp>
</root>