在 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>
如何将多个 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>