我需要按照语言字段的排序顺序多次迭代 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 处理器提示 select 表达式的计算结果不为节点集。
编辑:不确定这是否重要,但我有
<xsl:output encoding="UTF-8"
method="xml"
media-type="text/xml"
indent="yes" />
我必须在循环中插入什么才能将结果放入节点集中?这有可能吗?
最佳答案
既然你这么说
XSL processor complains that select expression does not evaluate to a node set.
我假设您使用的是 XSLT 1.0 而不是 2.0。在 XSLT 1.0 中,当您声明带有内容而不是 select
属性的变量时,生成的变量包含称为“结果树片段”的内容,而不是节点集。您可以将 value-of
和 copy-of
应用于 RTF 以将其发送到输出,但无法使用 XPath 表达式导航到它。
大多数 XSLT 处理器都提供某种扩展功能来将 RTF 转换为真实的节点集 - msxsl对于 Microsoft 处理器或 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 中,结果树片段和节点集之间没有区别 - 它们都被视为序列 - 因此您不需要该版本中的扩展函数。
关于xslt - xsl for-each 创建可迭代节点列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22835313/