2014-09-05 44 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