2014-09-05 103 views
-1

信息我这有部分XML:的XPath 1.0 - 从下一个节点

<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但我不知道怎么在这里

+1

我希望你的意思是在'',而不是'VALUE1'中,因为'VALUE1'是一个没有兄弟的文本节点。 – 2014-09-05 16:33:24

+0

......顺便说一句,请参阅我的更新答案,其中(1)基于@LarsH进行了修订,提供了对问题的更清晰解释,并且(2)包含一个XMLStarlet命令行,可用于运行该命令并演示正确输出。 – 2014-09-05 19:59:33

回答

2

你可能想following-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参数可以简单地认为第一Property;神奇的是在-v,它寻找兄弟Properties,并发现其中Property与匹配Descriptor

+0

我不能使用//因为有更多的属性使用这个名字 – 2014-09-05 16:39:07

+0

这是选择属性2我想:( – 2014-09-05 16:41:36

+1

我只使用'/ /'在我的例子中获取属性1.因为你已经开始在那里,你会忽略那部分,并从'./following-sibling::Property [1]'开始。我认为这很明显。 – 2014-09-05 16:42:50