要像这样按某个固定顺序对项目进行排序,您可以使用这样的技巧:为排序顺序定义一个变量
<xsl:variable name="sortOrder" select="'|hight|medium|low|'" />
现在您可以使用
<xsl:sort select="string-length(substring-before($sortOrder, concat('|', value, '|')))"
data-type="number" />
无论value
您需要什么。如果value
是“高”,则substring-before
长度为 0,对于“中”,长度为 6,依此类推。
这是一个 XSLT 2.0 模板,它可以满足您的需求,假设变量定义
<xsl:template match="items">
<items>
<xsl:for-each-group select="item" group-adjacent="substring-before(@name, '_')">
<xsl:perform-sort select="current-group()">
<xsl:sort select="string-length(substring-before($sortOrder,
concat('|', substring-after(@name, '_'), '|')))"
data-type="number" />
</xsl:perform-sort>
</xsl:for-each-group>
</items>
</xsl:template>
要在 XSLT 1.0 中做同样的事情,你需要做一个 Muenchian 分组技巧
<xsl:key name="itemByPrefix" match="item" use="substring-before(@name, '_')" />
然后在模板中
<xsl:template match="items">
<items>
<xsl:for-each select="item[generate-id() = generate-id(
key('itemByPrefix', substring-before(@name, '_'))[1])]">
<xsl:for-each select="key('itemByPrefix', substring-before(@name, '_'))">
<xsl:sort select="string-length(substring-before($sortOrder,
concat('|', substring-after(@name, '_'), '|')))"
data-type="number" />
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:for-each>
</items>
</xsl:template>
(如果源文档中有多个不同的集合,XSLT 2.0 版本仍然有效,items
在这种情况下 XSLT 1.0 版本会变得更加混乱)。