我有这个XML代码:
<items>
<item name="xyz_low" />
<item name="xyz_hight" />
<item name="xyz_medium" />
<item name="abc_medium" />
<item name="abc_low" />
<item name="abc_hight" />
</items>
我想获得这样的:
<items>
<item name="xyz_hight" />
<item name="xyz_medium" />
<item name="xyz_low" />
<item name="abc_hight" />
<item name="abc_medium" />
<item name="abc_low" />
</items>
排序只发生与属性名称(下划线之前的部分)相同的第一部分标记之间。 顺序是身高,中,低。
我已经看ends-with
,但它是不够的,因为我不知道,如果第一部分可以XYZ,农行或其他什么东西做的。
我并不需要在第一部分进行排序:我只是想集团以同样的方式开始项目标签内的后缀进行排序。
它是可能的,或者我应该选择不同的方法?
若要按一定固定的顺序的项目,如这个,你可以使用一个技巧是这样的:定义一个变量的排序顺序
<xsl:variable name="sortOrder" select="'|hight|medium|low|'" />
现在你可以使用排序
<xsl:sort select="string-length(substring-before($sortOrder, concat('|', value, '|')))"
data-type="number" />
不管什么value
,你需要。 如果value
是“HIGHT”,则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版本将得到在这种情况下很多混乱)。