XSLT使用字典对元素进行排序

时间:2015-02-20 13:26:22

标签: xslt

我有一个XML,它是一个包含其代码的国家/地区列表:

<Countries>
   <Country Code="DE" />
   <Country Code="FR" />
</Countries>

我将XSLT应用于此XML以转换为HTML,并且我希望元素按国家/地区名称而不是代码按字母顺序排序。

所以我定义了CountryCodeDictionaryEN变量,它是国家代码和名称的字典。它在<xsl:value-of />但在<xsl:sort />

内无效
<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:msxsl="urn:schemas-microsoft-com:xslt">

<xsl:variable name="CountryCodeDictionaryEN">
    <item key="Germany"
          value="DE" />
    <item key="France"
          value="FR" />
    ... all other countries ...
</xsl:variable>

<xsl:template match="/">
    <table>
        <xsl:for-each select="Countries/Country">
            <xsl:sort select="msxsl:node-set($CountryCodeDictionaryEN)/item[@value = @Code]/@key"/>
            <tr>
              <td>
                <xsl:variable name="Code" select="@Code"/>
                <xsl:value-of select="msxsl:node-set($CountryCodeDictionaryEN)/item[@value = $Code]/@key"/>
              </td>
           </tr>
       </table>
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

item[@value = @Code]value的{​​{1}}属性与同一项的item属性进行比较。由于Code元素没有item属性,Code表达式将始终导致空节点集,因此每个节点将获得相同(空字符串)排序键。由于select是稳定的(具有相同排序键值的项目保留其原始相对排序),因此整体效果无需排序。

您需要使用current()来“突破”谓词并引用节点xsl:sort - 编辑:

sort

这会将<xsl:sort select="msxsl:node-set($CountryCodeDictionaryEN) /item[@value = current()/@Code]/@key"/> 的{​​{1}}与value的{​​{1}}进行比较。