XPath语句将整数变量分配给powershell脚本中的position()函数

XPath语句将整数变量分配给powershell脚本中的position()函数,xpath,powershell-2.0,Xpath,Powershell 2.0,我正在编写一个Powershell脚本,该脚本将XML文件作为输入,搜索与该XML文件中特定元素/标记关联的内部文本,并返回该元素/标记的位置(如果存在),以便使用该元素的位置用其他一些数据替换内部文本。例如,可能有一个xml文件如下所示 <root> <category> <fruit>apple</fruit> <vegetable>broccoli</vegetable>

我正在编写一个Powershell脚本,该脚本将XML文件作为输入,搜索与该XML文件中特定元素/标记关联的内部文本,并返回该元素/标记的位置(如果存在),以便使用该元素的位置用其他一些数据替换内部文本。例如,可能有一个xml文件如下所示

<root>
    <category>
        <fruit>apple</fruit>
        <vegetable>broccoli</vegetable>
        <fruit>pear</fruit>
        <vegetable>brussel sprouts</vegetable>
        <fruit>orange</fruit>
    </category>
</root>

苹果
花椰菜
梨
布鲁塞尔芽菜
橙色
因此,假设在我的Powershell脚本的一部分中,我有一些代码来查找内部文本“orange”。我想将包含“orange”作为其内部文本的“fruit”元素的“position”整数存储在一个变量中。因此,在上面的xml文件中,位置整数将是3(如果从零开始,则为2)。我应该如何编写一个正确的XPath语句来通过变量访问第三个“水果”位置?也许我想访问这个位置,这样我可以将“橙色”改为“香蕉”或其他什么。我尝试了以下方法,但没有成功

$orangePosition=???(I为测试目的指定了值3)

root.SelectSingleNode(“后代::类别/果实[position()=$orangePosition]”)


我看到过“position()被分配了一个整数值。我想用一个变量来代替整数,因为我不知道特定文件中的内部文本“orange”可能是什么索引。这可能吗?我见过其他帖子对类似问题提出质疑,但当我应用解决方案时,它们似乎都不起作用(如果有说明)到powershell脚本)。关于如何解决这个问题有什么想法吗?

您可以使用
root.SelectNodes(“//category/fruit[.='orange']/previous sibling::fruit)。计数+1
。如果您想单独使用XPath,请使用
Evaluate
方法,例如
root.CreateNavigator().Evaluate(“count(//category/fruit[.='orange']/previous sibling::fruit)+1”)
。这应该会返回一个C#
值。

看来我让这变得比需要的更难了。经过广泛的研究,我了解到实际上根本不需要使用索引/位置整数。我可以通过做以下事情来实现我所需要的

<root>
    <category>
        <fruit>apple</fruit>
        <vegetable>broccoli</vegetable>
        <fruit>pear</fruit>
        <vegetable>brussel sprouts</vegetable>
        <fruit>orange</fruit>
    </category>
</root>
root.SelectNodes('//categories/fruit')|其中对象{$.InnerText.Contains('orange')}| foreach{$.InnerText-eq'banana'}


但是,我仍然可以想到一些情况,在这些情况下,我可能想知道我想要编辑的元素的索引,以便排除可能包含相同innertext的其他类似元素。不管怎样,这对我来说已经足够好了。感谢所有响应并试图提供帮助的人。

你犯了一个根本性的错误,认为position()返回节点在其兄弟节点中的位置。它不是这样做的。此外,在XPath 1.0中,使用position()唯一有用的地方是在谓词中,这意味着它不能是表达式的结果。我理解你的第一句话。我确实意识到我对“position()”实际作用的理解可能是不正确的。这就是我提出这个问题并试图澄清的原因。我不太理解你陈述的第二部分。您声明使用“position()”唯一有用的地方是在谓词中。谓词是方括号中XPath语句的一部分,对吗?因此,当我编写一个包含“category/fruit[position()=]”的路径时,从我所见过的每个示例来看,这是将position()包含在谓词范围内的正确格式,不是吗?您能否进一步解释或让我参考我能理解的资源进行澄清。我不是一个使用XPath的专家,所以如果您能给我提供任何信息,我将不胜感激。再次感谢您的反馈。