XSLT - 遍历节点集
XSLT - Iterate through node-set
我有一个 xml 这样的:
<root>
<row>
<col name="col1"><root><row><col name="COL_NAME_1">col_value_1</col>;</row></root></col>
<col name="col2"><root><row><col name="COL_NAME_2">col_value_2</col>;</row></root></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 中正确读取值,但我无法像没有行一样对其进行迭代。知道我做错了什么吗?
node-set()
函数不解析。您的 $collection
变量是一个节点集,由一个临时文档节点和一个 col
子节点组成。
Saxon 有一个名为 parse()
的扩展函数,它可以满足您的需求,其他一些 XSLT 处理器也是如此。我也看到有人尝试用纯 XSLT 对此进行编码,但不知道是否有好的实现。
如果此 XML 的作者希望您在 col 元素中看到诸如 root 和 row 之类的元素,它们就不会转义尖括号。因为它们被转义了,所以这里没有结构,只有文本。从文本中获取结构的操作称为解析。 XSLT 3.0 有一个函数 parse-xml() 来解析文本并创建树结构;较早的版本没有,尽管您的供应商可能会提供扩展,或者您可以编写自己的扩展。
我有一个 xml 这样的:
<root>
<row>
<col name="col1"><root><row><col name="COL_NAME_1">col_value_1</col>;</row></root></col>
<col name="col2"><root><row><col name="COL_NAME_2">col_value_2</col>;</row></root></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 中正确读取值,但我无法像没有行一样对其进行迭代。知道我做错了什么吗?
node-set()
函数不解析。您的 $collection
变量是一个节点集,由一个临时文档节点和一个 col
子节点组成。
Saxon 有一个名为 parse()
的扩展函数,它可以满足您的需求,其他一些 XSLT 处理器也是如此。我也看到有人尝试用纯 XSLT 对此进行编码,但不知道是否有好的实现。
如果此 XML 的作者希望您在 col 元素中看到诸如 root 和 row 之类的元素,它们就不会转义尖括号。因为它们被转义了,所以这里没有结构,只有文本。从文本中获取结构的操作称为解析。 XSLT 3.0 有一个函数 parse-xml() 来解析文本并创建树结构;较早的版本没有,尽管您的供应商可能会提供扩展,或者您可以编写自己的扩展。