Xml XPath 1.0-来自下一个节点的信息
我得到了这个部分XML:Xml XPath 1.0-来自下一个节点的信息,xml,xpath,xpath-1.0,Xml,Xpath,Xpath 1.0,我得到了这个部分XML: <Events> <Properties> <Property Descriptor="1">VALUE1</Property> <Property Descriptor="2">1</Property> <Property Descriptor="3">start</Property> </Properties>
<Events>
<Properties>
<Property Descriptor="1">VALUE1</Property>
<Property Descriptor="2">1</Property>
<Property Descriptor="3">start</Property>
</Properties>
<Properties>
<Property Descriptor="1">VALUE2</Property>
<Property Descriptor="2">1</Property>
<Property Descriptor="3">end</Property>
</Properties>
</Events>
如果我在VALUE1中,如何查询VALUE2[下一个属性节点]
我尝试了/next sibling,但我不确定如何在这里应用它您可能需要跟随sibling
从文档顶部演示:
//Property[@Descriptor="1"][1]/../following-sibling::Property[1]
如果您已经在描述符为1的属性处:
./following-sibling::Property[1]
以上是基于对问题的误读。请参见:
xmlstarlet sel -t -m '//Property[@Descriptor="1"][1]' \
-v '../following-sibling::Properties[1]/Property[@Descriptor=./@Descriptor][1]' \
-n <foo.xml
第一个-m参数只找到第一个属性;神奇之处在于-v,它查找同级属性并在其中找到一个具有匹配描述符的属性。我希望你的意思是in,而不是VALUE1,因为VALUE1是一个没有同级的文本节点……顺便说一句,请参阅我的更新答案,其中1根据@LarsH对问题进行了更清晰的解释进行了修改,2包含一个XMLStarlet命令行,可以用来运行它并演示正确的输出。我不能使用//因为有更多具有此名称的属性。在我的示例中,我只使用//来获取属性1。既然您已经从这里开始了,那么您应该省略该部分,从./following sibling::Property[1]开始。我认为这是显而易见的。@Dalek,正如我已经说过的,您需要从属性开始,而不是从文本节点开始。如果从文本节点开始,请使用../而不是./。无论如何,我给出第一个表单的全部原因是,它是我实际测试的东西。如果你要声明它不起作用,那么你需要提供一个它不起作用的复制器。这个答案被接受了,所以它可能满足OP的需要,但这不是他要求的,这是如何找到下一个属性节点。我将其解释为“而非”,这与OP的说法一致,即他在寻找价值2。@LarsH,…啊!这是有道理的。我已经适当地调整了它;谢谢你的接球。