繁体   English   中英

exsl:node-set将什么视为根节点?

[英]What does exsl:node-set treat as the root node?

我无法理解exsl:node-set函数的工作原理。

我有一些XML,我正在扩展并使用它来动态填充exsl:node-set。 我们说它目前采用以下格式:

<xsl:variable name="wrap">
    <nodes>
        <node/>
        <node/>
        <node/>
    </nodes>
</xsl:variable>
<xsl:variable name="wrapNodeSet" select="exsl:node-set($wrap)"/>

这可以根据需要工作,输出$ wrapNodeSet显示上面的节点标记。 根节点名称使用name($ wrapNodeSet / *)显示为“nodes”。

现在我需要扩展它以拥有2个节点并动态填充节点集。 所以:

    <xsl:variable name="wrap">
    <nodes tier="a">
        <node/>
        <node/>
        <node/>
    </nodes>
    <nodes tier="b">
        <node/>
        <node/>
        <node/>
    </nodes>
</xsl:variable>
<xsl:variable name="wrapNodeSet" select="exsl:node-set($wrap)/nodes[@tier='b']"/>

输出节点集包括节点元素,但输出根节点的名称现在更改为“节点”。

有人可以解释为什么节点元素仍然输出?

如果我正确地理解了你的问题,我相信'直觉''正在发生的事情(实际的幕后实现细节可能有点不同)是在第一个例子中,你的变量指向的是'匿名节点集'包装<nodes>元素的变量。 因此,使用name($wrapNodeSet/*)获取此匿名节点集的所有直接子节点的名称,在这种情况下,它只是单个<nodes>元素的名称。

在第二种情况下,您比匿名节点集更深入,并且变量直接包含单个nodes[@tier='b']元素。 在这种情况下, name($wrapNodeSet/*)选择该<nodes>元素的所有直接子<nodes> ,并返回<node> 3个实例。 如果对此执行select-value值,则默认只显示第一个值,这就是为什么您只在输出中看到“node”的原因。

要获取第二个实例的根名称,只需直接name($wrapNodeSet) ,您应该看到“nodes”。 在第一个实例中执行$name(wrapNodeSet)将不会返回任何内容,因为匿名节点集没有名称。

<xsl:variable name="wrapNodeSet" 
              select="exsl:node-set($wrap)/nodes[@tier='b']"/>

这将从使用node-set()扩展获得的树中选择任何nodes元素,即( nodes元素)具有值为'b'tier属性。

然后:

name($wrapNodeSet/*)

生成$wrapNodeSet包含的第一个节点的第一个子元素的$wrapNodeSet 由于$wrapNodeSet包含一个nodes元素,而nodes元素只有node子元素,因此第一个这样的子元素是一个node元素及其名称,因为任何node元素的名称都是"node"

你为什么看到这个结果出乎意料?

换句话说

在两种情况下,在$wrap上应用ext:node-set()会生成相同的树,但在第二种情况下,在ext:node-set($wrap)的结果上使用不同的,更长的XPath表达式 - 因此从评估这两个不同的XPath表达式得到的不同结果。

exslt:node-set有一个非常非正式的规范,可能有关于哪些实现彼此不同的详细信息。 在边缘情况下肯定是这样,例如,如果exstl:node-set的参数不是结果树片段,会发生什么。

我期望的行为是exslt:node-set()总是提供“根节点”(XPath 2.0称之为“文档节点”)。 XPath 1.0中定义的根节点没有名称。 在第一个示例中,根节点有一个名为“nodes”的元素子节点。 在第二个示例中,根节点有两个元素子节点,它们都具有名称“nodes”。

您说“输出根节点的名称现在更改为'node'” - 这令人困惑,因为XPath 1.0中的“根节点”定义了术语永远不会有名称。 你实际输出了什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM