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>
我想按照 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>