2014-09-05 2 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' является текстовым узлом, у которого нет братьев и сестер. –

+0

... кстати, см. Мой обновленный ответ, который (1) переработан на основе @LarsH, обеспечивающий более четкую интерпретацию вопроса, и (2) включает в себя командную строку XMLStarlet, которая может использоваться для ее запуска и демонстрации правильного вывод. –

ответ

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

Я не могу использовать //, поскольку есть больше свойств с этим именем. –

+0

Это выбор свойства 2. Я полагаю :( –

+1

Я использую '//' в моем примере для получения свойства 1. Поскольку вы уже начинаете там, вы должны оставить эту часть и начать с './following-sibling::Property [1]'. Я думал, что это очевидно. –

Смежные вопросы