【问题标题】:XSLT - Iterate through node-setXSLT - 遍历节点集
【发布时间】:2015-03-31 13:52:11
【问题描述】:

我有一个这样的 xml:

<root>
<row>
    <col name="col1">&lt;root&gt;&lt;row&gt;&lt;col name=&quot;COL_NAME_1&quot;&gt;col_value_1&lt;/col&gt;;&lt;/row&gt;&lt;/root&gt;</col>
    <col name="col2">&lt;root&gt;&lt;row&gt;&lt;col name=&quot;COL_NAME_2&quot;&gt;col_value_2&lt;/col&gt;;&lt;/row&gt;&lt;/root&gt;</col>
</row></root>

我需要从 col1 中获取转义集合并遍历其行。 我正在使用 exsl:node-set 函数。这是我的简化 xsl:

<xsl:template match="/">
<xsl:variable name="collection" select="exsl:node-set(./root/row/col[@name='col1'])" disable-output-escaping="yes" />
<xsl:for-each select="($collection)/root/row">
    <!-- ... -->
</xsl:for-each></xsl:template>

我可以使用 xsl:value-of 函数从变量 $collection 中正确读取值,但我无法像没有行一样对其进行迭代。任何想法我做错了什么?

【问题讨论】:

  • 您使用的是哪个处理器?

标签: xml xslt exslt node-set


【解决方案1】:

如果此 XML 的作者希望您在 col 元素中看到诸如 root 和 row 之类的元素,他们就不会转义尖括号。因为它们被转义了,所以这里没有结构,只有文本。从文本中获取结构的操作称为解析。 XSLT 3.0 有一个函数 parse-xml() 来解析文本并创建树结构;早期版本没有,但您的供应商可能会提供扩展,或者您可以自己编写。

【讨论】:

    【解决方案2】:

    node-set() 函数无法解析。您的 $collection 变量是一个节点集,由一个临时文档节点和一个 col 子节点组成。

    Saxon 有一个名为 parse() 的扩展函数,它可以满足您的需求,其他一些 XSLT 处理器也是如此。我也看到了一些用纯 XSLT 编写代码的尝试,但不知道是否有好的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多