我觉得,这是一个基本的XSLT问题。 根据我的理解,节点集本身就是数据结构。 从node-set()我无法导航到集合之外的任何节点。 即我无法到达父母,xml的开头也不是它的兄弟姐妹。 这是正确的吗?

要么

有没有办法获得node-set()的父级

<neighbourhood>
<parent name = "xyz">
<child address=10> a </child>
<child address=10> b </child>
<child address=15> c </child>
</parent>
</neighbourhood>

我有一组子节点。 我需要消除具有重复“地址”的节点。 可以有n个'parent'和m个'child',并且可以有'child'的祖父节点。

最好的和合乎逻辑的方式可能是由每个父母去处理他们的孩子。 但是,它是一个现有的代码库,这是一个过于简单的例子。 我不想通过触摸调用函数和其他模板来破解太多东西。

所以,我的问题是我是否可以通过我拥有的'子'节点来获得'父'

感谢您的所有回复

#1楼 票数:3

node-set()是否有祖先节点?

node-set()是(扩展)函数 - 不是节点。 函数不能具有祖先,因为它不是节点。

我想通过问题中的"node-set()" ,你的意思是xxx:node-set()函数返回的值(其中前缀“xxx”绑定到特定于供应商的命名空间)。 如果是这样,这是通缉答案:

根据定义, xxx:node-set()函数返回临时树的document-node() (在XPath 1.0中也称为root-node ),它是通过转换RTF(Result Tree Fragment)获得的,这个函数的唯一参数。

根据定义,文档节点位于文档层次结构的顶部,是XML文档中唯一没有父文档的节点。

因此,被调用的xxx:node-set()函数返回的xxx:node-set()没有任何祖先

从node-set()我无法导航到集合之外的任何节点。 即我无法到达父母,xml的开头也不是它的兄弟姐妹。 这是正确的吗?

是的,如果不调用另一个从另一个文档返回节点的函数(例如标准XPath函数id()或标准XSLT函数document() ),或者引用变量/参数,则无法从中导航到节点另一个文档只能使用XPath位置步骤。

要么

有没有办法获得node-set()的父级

不, xxx:node-set()函数返回的xxx:node-set()是文档节点,文档节点没有父节点(或任何其他祖先)节点。

#2楼 票数:2

不要混淆节点集和node-set()

这是什么意思? 嗯,节点集是一组节点。 在正常的,未扩展的XSLT 1.0中,这意味着从输入文档中选择节点。 如果我这样做:

<!-- a node set -->
<xsl:variable name="my-node-set"
    select="/indoc/level1/level2"/>

变量$my-node-set包含一组level2节点,但这些节点仍然存在于输入文档中。 如果我随后做了for-each像这样的人:

<nodeset-from-indoc>
    <xsl:for-each select="$my-node-set/level3">
         <parent>
             <xsl:value-of select="local-name(..)"/>
         </parent>
         <grandparent>
             <xsl:value-of select="local-name(../..)"/>
         </grandparent>
     </xsl:for-each>
 </nodeset-from-indoc>

获得每个节点的父母和祖父母的姓名:

<nodeset-from-indoc>
    <parent>level2</parent><grandparent>level1</grandparent>
    <parent>level2</parent><grandparent>level1</grandparent>
    <parent>level2</parent><grandparent>level1</grandparent>
</nodeset-from-indoc>

但是,如果我将节点硬编码为变量:

<!-- a result-tree fragment -->
<xsl:variable name="my-rtf">
    <level2>
        <level3>1</level3>
    </level2>
    <level2>
        <level3>2</level3>
    </level2>
    <level2>
        <level3>3</level3>
    </level2>
</xsl:variable>

不是节点集,而是结果树片段,因为它们未从输入文档中选择。 结果树片段的问题是您不能在它们上使用XPath。 例如,我不能这样做:

<xsl:for-each select="$my-rtf/level3">

这是node-set()函数的用武之地。它是XSLT 1.0的扩展,它来自某些扩展名称空间,具体取决于您的XSLT处理器。 许多处理器选择在EXSLT定义的命名空间中实现它。

正如Dmitre指出的那样,node-set()函数返回临时树的魔术文档节点,允许您使用XPath。 但是 ,这会导致选择需要如何进行微妙的转变。 由于魔术文档节点,我必须在我的选择中包含level2

<nodeset-from-rtf>
    <xsl:for-each select="exsl:node-set($my-rtf)/level2/level3">
        <parent>
            <xsl:value-of select="local-name(..)"/>
        </parent>
        <grandparent>
            <xsl:value-of select="local-name(../..)"/>
        </grandparent>
    </xsl:for-each>
</nodeset-from-rtf>

在这种情况下, level3节点将有父母,但没有祖父母:

<nodeset-from-rtf>
    <parent>level2</parent><grandparent/>
    <parent>level2</parent><grandparent/>
    <parent>level2</parent><grandparent/>
</nodeset-from-rtf>

#3楼 票数:2

节点集是一组节点。 节点集中的每个节点都有祖先。 节点集本身没有。 如果$ NS是一个节点集,你可以做$NS/ancestor::node() :这将为你提供节点集中所有节点的所有祖先,并删除重复项。

  ask by user3208131 translate from so

未解决问题?本站智能推荐:

3回复

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

我无法理解exsl:node-set函数的工作原理。 我有一些XML,我正在扩展并使用它来动态填充exsl:node-set。 我们说它目前采用以下格式: 这可以根据需要工作,输出$ wrapNodeSet显示上面的节点标记。 根节点名称使用name($ wrapNodeSet
2回复

排序为exsl:node-set。 返回节点的位置

我有一组节点 我现在这样排序了 现在,我需要在排序后的数组中获取一个任意元素,以其位置的数量表示。 我正在使用代码: 我得到一个响应错误。 我应该怎么做?
3回复

什么是更好的msxsl:node-set()或exsl:node-set()函数?

在XSLT转换过程中,我遇到了很大的性能和内存使用问题。 我已经浏览了几页如何优化XSLT,其中一种方法是减少node-set()函数的使用。 我发现在msxsl和exsl中有两个node-set函数。 这些功能在性能和内存使用方面是否不同?
2回复

为什么不能在XPath-Expression中使用通过exsl:node-set / set:distinct检索的节点的值?

在xslt样式表中,我使用exsl:node-set和set:distinct来访问和过滤包含结果树片段的变量中的唯一节点。 我可以将这些节点的值写入输出文件,例如: 按键值将按预期方式写入输出中。 但是,如果我尝试在XPath表达式中使用值,它将失败: 现在,输出为空,而我
3回复

msxsl:node-set()和position()不能一起使用

我有一个xsl:variable,其中包含一个预处理集(DoesNotContainChildElement)。 我认为msxsl:node-set()添加了一个根元素,因此位置始终为1。但是我需要它的前15个元素。
1回复

无法识别msxsl:node-set()

我正在尝试使用msxsl:node-set()函数从存储在变量中的节点集中拉出节点,但没有得到任何结果。 我的xml看起来像这样: 在我的xslt中,我尝试用节点的子集填充变量,然后使用msxsl:node-set()函数调用它们。 但是,这不会返回任何内容。 XSLT看起来像这样
1回复

自动化 exslt:node-set?

不确定这是否可行,但尝试设置一些不会使我在从动态创建的节点块中提取值时必须键入 exslt:node-set 的内容。 我将整个节点集存储在一个变量中,并将其包装在 exslt:node-set 中,但是为什么当我尝试从中提取时它不起作用。 这可能吗?
2回复

查询msxsl:node-set的结果不起作用

我正在使用node-set内置函数将xsl变量转换为节点集,如以下代码所示 命令<xsl:copy-of select="$allotmentValuesNodeSet"/>产生以下输出: 当我尝试使用此xsl命令<xsl:value-of select="co