我需要遍历XML文件中的元素在他们的语言里许多次的排序顺序。 我尝试如下得到语言的迭代列表:
<xsl:variable name="languages">
<xsl:for-each select="elem/FIELD[@NAME='language']">
<xsl:sort select="."/>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:variable>
虽然我可以用验证
<xsl:value-of select="$languages"/>
该排序的作品,我不能像迭代
<xsl:for-each select="$langauges">...</xsl:for-each>
因为XSL处理器抱怨选择表达式的值不至节点集。
编辑:不知道这是否是重要的,但我有
<xsl:output encoding="UTF-8"
method="xml"
media-type="text/xml"
indent="yes" />
我有什么在回路中插入使结果为节点集? 这是可能吗?
给你说
XSL处理器抱怨选择表达式的值不至节点集。
我假设你正在使用XSLT 1.0,而不是2.0。 在XSLT 1.0当你声明一个变量的内容,而不是select
属性,所产生的变量包含一种叫做“结果树片段”,而不是一个节点集。 您可以应用value-of
和copy-of
一个RTF将其发送到输出,但使用XPath表达式不能导航到它。
大多数XSLT处理器提供某种形式的扩展功能的一个RTF转换成真正的节点集- msxsl为微软处理器或EXSLT对大多数人。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl">
<!-- .... -->
<xsl:variable name="languagesRTF">
<xsl:for-each select="elem/FIELD[@NAME='language']">
<xsl:sort select="."/>
<lang><xsl:value-of select="."/></lang>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="languages" select="exsl:node-set($languagesRTF)/lang" />
在XSLT 2.0有结果树碎片和节点集之间没有区别 - 他们都被视为序列 - 所以你不需要在该版本的扩展功能。
尝试以下方法:
要声明的变量:
<xsl:variable name="languages">
<xsl:for-each select="elem/FIELD[@NAME='language']">
<xsl:sort select="."/>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:variable>
而循环:
<xsl:for-each select="$languages/*">
您需要将结果树片段转换成您的变量为节点集,使用EXSLT节点集()函数 。
XSLT 1.0允许你处理节点集合以排序的顺序,但它不会让你保存在变量一个排序序列(数据模型只有套,不序列)。 您可以在1.0保存排序的数据的唯一途径是构建包含原始元素的副本以不同的顺序一个新的树,然后使用节点集()扩展,使这棵树加工。
这改变了在XSLT 2.0,它具有基于序列的数据模型。 在2.0中,你可以在一个变量保存节点的排序序列不复制节点进入一个新的树。