0

我有这个 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、abc 或其他东西。

我不需要对第一部分进行排序:我只想以相同的方式对一组项目标签中的后缀进行排序。

有可能还是我应该选择不同的方法?

4

1 回答 1

2

要像这样按某个固定顺序对项目进行排序,您可以使用这样的技巧:为排序顺序定义一个变量

<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 版本会变得更加混乱)。

于 2013-05-28T14:10:18.460 回答