我有一个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>
答案 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}}进行比较。