在 XSLT 2.0 中合并和排序元素

Merge and sort Elements in XSLT 2.0

如何将多个 XML 结构与 XSLT 2.0 和 XSL-FO 合并,方法是将它们按第一个子项 (-entry) 分组,然后从 a 到 z 对它们进行排序?

详细信息如下:

<keyword>
    <key-entry>example<key-entry>
    <key-entry>hello</key-entry>
    <key-entry>world</key-entry>
</keyword>

<keyword>
    <key-entry>another example</key-entry>
    <key-entry>with other data</key-entry>
</keyword>

<keyword>
    <key-entry>example</key-entry>
    <key-entry>nice to see you!</key-entry>
</keyword>

像这样:

<fo:block>A</fo:block>
<fo:block>another example</fo:block>
    <fo:block>with other data</fo:block>

<fo:block>E</fo:block>
<fo:block>example</fo:block>
    <fo:block>hello</fo:block>
    <fo:block>world</fo:block>
    <fo:block>nice to see you!</fo:block>

由于您使用的是 XSLT 2.0,因此可以使用 xsl:for-each-group。参见 http://www.w3.org/TR/xslt20/#grouping

您需要两个级别的 xsl:for-each-group:一个用于获取首字母,第二个用于在每个 keyword.

中按第一个 key-entry 分组
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes" />

    <xsl:template match="keywords">
      <fo:block>
        <xsl:for-each-group
            select="keyword"
            group-by="upper-case(substring(key-entry[1], 1, 1))">
          <xsl:sort select="current-grouping-key()" />
          <fo:block>
            <xsl:value-of select="current-grouping-key()" />
          </fo:block>
          <xsl:for-each-group
              select="current-group()"
              group-by="key-entry[1]">
            <fo:block>
              <xsl:value-of select="current-grouping-key()" />
            </fo:block>
            <xsl:apply-templates
                select="current-group()/key-entry[position() > 1]" />
          </xsl:for-each-group>
        </xsl:for-each-group>
      </fo:block>
    </xsl:template>

    <xsl:template match="key-entry">
      <fo:block>
        <xsl:apply-templates />
      </fo:block>
    </xsl:template>
</xsl:stylesheet>

产生:

<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:block>A</fo:block>
   <fo:block>another example</fo:block>
   <fo:block>with other data</fo:block>
   <fo:block>E</fo:block>
   <fo:block>example</fo:block>
   <fo:block>hello</fo:block>
   <fo:block>world</fo:block>
   <fo:block>nice to see you!</fo:block>
</fo:block>