如何引用序列中的“下一个”(尚不存在)XML节点?

时间:2009-03-27 10:53:55

标签: xml xpath xquery

所以要扩大......

我有一些XML

<root>
    <list>
        <item value="9"/>
        <item value="3"/>
        <item value="1"/>
        <item value="8"/>
        <item value="4"/>
    </list>
</root>

我有一个XPath“/ root / list / item [4]”我相信它将检索第5个'item'元素(其value属性为4)

这表明XPath“/ root / list / item [5]”将引用(当前不存在的)第6项。

我想要的是一个XPath表达式,它将引用'Next'(尚未存在)'item'元素,无论当前有多少项......

我认为这会传递一个表达式(它将计算当前元素的数量)而不是硬编码的数字。

我知道我会怎么做,但根本找不到我应该怎么做......令人沮丧。

更新:澄清......我想返回“最后一个项目节点之后的项目节点”。这些属性只是为了区分现有节点)。我很欣赏这将返回一个空的节点集。

更新:我有我的答案所以我想我只能解释为什么我想要这个:)

基本上,某些.Net代码使用xPath作为写地址而不是读地址。

我将不存在的位置的xPath传递给EnsureNodeExists例程。 (注意:我不能改变这个EnsureNodeExists例程) 代码将迭代xPath的每个元素,如果它不存在则创建它,然后将其设置为下一次迭代的父元素。

因此,我可以使用“/ root / list / item [position()= last()] / following-sibling :: item [1]”3次调用此代码,这将导致创建3个项目节点。

4 个答案:

答案 0 :(得分:5)

首先,你的XPath:

/root/list/item[4]

获取第四项(因为[4]谓词是[position() = 4]的简写)。

要使用@value 4获取项目,请使用:

/root/list/item[@value = '4']

如果您想在@value 4的项目后获取项目,请使用:

/root/list/item[@value = '4']/following-sibling::item[1]

这将英语翻译为“从/root/list/item @value = '4'开始,查看以下名为'item'的兄弟姐妹,并选择第一个”。

即使没有以下项目,这也有效。在这种情况下,所选节点集将为空。

编辑:请注意,如果有多个项目的值为4,则上述表达式产生的结果可能会出乎意料。您将获得值为4的项目后面的所有项目。这将最多返回一个项目:

/root/list/item[@value = '4'][1]/following-sibling::item[1]

要引用列表中的最后一个节点,请使用:

/root/list/item[position() = last()]

可以在此处找到解释XPath axes的精彩视觉效果:http://nwalsh.com/docs/tutorials/xsl/xsl/graphics/axes.giflarger tutorial的一部分)。

答案 1 :(得分:3)

如果你只是想让一个表达式返回一个空的节点集,我认为通常的事情就像/parent::node()一样,因为根没有父节点,所以它是空的。

我想你可以做/root/list/item[position() = (last() + 1)]之类的事情,但它会给你与没有返回任何节点的东西相同的结果。所以我不太确定你真正想要实现的目标。

答案 2 :(得分:1)

尝试以下兄弟表达式

可以找到here

这类事情的帮助

答案 3 :(得分:0)

如果你要做的是添加一个新节点,直接在你的集合中的最后一个节点之后,那么在MSXML中你可以在你的父元素(列表)上使用appendChild。它将作为父节点的最后一个子节点附加。