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

Ror*_*ker 0 xml xpath xquery

所以要扩大......

我有一些XML

<root>
    <list>
        <item value="9"/>
        <item value="3"/>
        <item value="1"/>
        <item value="8"/>
        <item value="4"/>
    </list>
</root>
Run Code Online (Sandbox Code Playgroud)

我有一个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个项目节点.

Tom*_*lak 5

首先,你的XPath:

/root/list/item[4]
Run Code Online (Sandbox Code Playgroud)

获取第四个项目(因为[4]谓词是简写[position() = 4]).

要使用@value4 获取项目,请使用:

/root/list/item[@value = '4']
Run Code Online (Sandbox Code Playgroud)

如果要在项目后面用@value4 获取项目,请使用:

/root/list/item[@value = '4']/following-sibling::item[1]
Run Code Online (Sandbox Code Playgroud)

这意味着,以英文为"从去/root/list/item@value = '4',看看命名为'项’下面的兄弟姐妹和占据第一位".

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

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

/root/list/item[@value = '4'][1]/following-sibling::item[1]
Run Code Online (Sandbox Code Playgroud)

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

/root/list/item[position() = last()]
Run Code Online (Sandbox Code Playgroud)

可以在此处找到解释XPath轴的良好视觉效果:http://nwalsh.com/docs/tutorials/xsl/xsl/graphics/axes.gif(较大教程的一部分).