XSLT - 遍历节点集

时间:2015-03-31 13:52:11

标签: xml xslt exslt node-set

我有一个像这样的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中的值,但我不能迭代它,好像没有行一样。我有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

Saxon有一个名为parse()的扩展函数,可以执行您想要的操作,就像其他一些XSLT处理器一样。我也看到了在纯XSLT中对此进行编码的一些尝试,但不知道是否有一个很好的实现。