所以要扩大......
我有一些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个项目节点。
答案 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.gif(larger tutorial的一部分)。
答案 1 :(得分:3)
如果你只是想让一个表达式返回一个空的节点集,我认为通常的事情就像/parent::node()
一样,因为根没有父节点,所以它是空的。
我想你可以做/root/list/item[position() = (last() + 1)]
之类的事情,但它会给你与没有返回任何节点的东西相同的结果。所以我不太确定你真正想要实现的目标。
答案 2 :(得分:1)
尝试以下兄弟表达式
可以找到here
这类事情的帮助答案 3 :(得分:0)
如果你要做的是添加一个新节点,直接在你的集合中的最后一个节点之后,那么在MSXML中你可以在你的父元素(列表)上使用appendChild。它将作为父节点的最后一个子节点附加。