xslt - xsl for-each 创建可迭代节点列表

标签 xslt

我需要按照语言字段的排序顺序多次迭代 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-ofcopy-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/

相关文章:

xml - 每个节点的最大不同子元素数

java - 从 XSL 访问 Java 公共(public)静态

xml - 如何使用XPath在特定属性范围之间选择值

xml - 处理 XSLT 函数中的空序列

xslt - FOP 警告 :line 1 of a paragraph overflows the available area by more than 50 points

c# - 如何获取XSL文件目录的绝对路径?

xml - XSLT 2.0 中的简洁正则表达式提取功能

xslt - 如何在XSLt 2.0中为每个循环丢弃重复结构。

java - 使用 Java 修改 XML 文件

xml - XSL : output of "nested" structures