0

所以要展开...

我有一些 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 表达式,它将引用“下一个”(尚不存在)“项目”元素,而不管当前有多少项目......

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

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

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

更新:嗯,我有我的答案,所以我想这是公平的,我解释了为什么我想要这个:)

基本上xPath被一些.Net代码用作写地址而不是读地址。

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

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

4

4 回答 4

5

首先,您的 XPath:

/root/list/item[4]

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

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

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

如果你想用@value4 获取项目之后的项目,请使用:

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

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

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

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

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

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

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

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

于 2009-03-27T11:00:21.330 回答
3

如果你只是想让一个表达式返回一个空的节点集,我认为一般要做的事情是类似的/parent::node(),因为根没有父母,所以它是空的。

我想你可以做类似的事情/root/list/item[position() = (last() + 1)],但它会给你与任何不返回节点的结果相同的结果。所以我不太确定你实际上想要完成什么。

于 2009-03-27T11:28:21.530 回答
1

尝试以下兄弟表达式

可以在此处找到有关此类事情的帮助

于 2009-03-27T11:02:47.113 回答
0

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

于 2010-12-04T14:39:49.287 回答