Как найти все узлы определенного типа в XPath - PullRequest
6 голосов
/ 03 марта 2011

Допустим, у меня есть следующий экземпляр данных формы в моем view.xml:

<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
xmlns:exforms="http://www.exforms.org/exf/1-0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xhtml:head>
<xforms:instance id="instanceData">
    <form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <fruits>
     <fruit>
        <fruit-name>Mango</fruit-name>
     </fruit>
     <fruit>
        <fruit-name>Apple</fruit-name>
     </fruit>
     <fruit>
        <fruit-name>Banana</fruit-name>
     </fruit>
</fruits>
</form>
</xforms:instance>
</xhtml:head>

Я хочу выбрать все названия фруктов из вышеупомянутого экземпляра.Я пробовал следующие способы, но он всегда выбирает первый фрукт.

instance('instanceData')/fruits/fruit[*]/fruit-name
instance('instanceData')/fruits/fruit/fruit-name
instance('instanceData')/fruits/fruit[position()>0]/fruit-name

Пожалуйста, предоставьте способ преодолеть это в XPATH

Ответы [ 3 ]

8 голосов
/ 03 марта 2011

попробуйте это

             "//fruit-name"

Он найдет все названия фруктов, где бы они ни находились в иерархии документов.

3 голосов
/ 04 марта 2011

Если вы хотите выбрать все <fruit-name> из экземпляра instanceData (<xforms:instance id="instanceData">), который выглядит как тот, который у вас есть в вашем вопросе, следующее должно сделать это:

instance('instanceData')/fruits/fruit/fruit-name

Если это не работает, одной из распространенных причин является то, что у вас есть объявление пространства имен по умолчанию в документе, который содержит ваш экземпляр, например: xmlns="http://www.w3.org/1999/xhtml".Если у вас есть это, вам нужно отменить это объявление пространства имен по умолчанию в том месте, где вы объявляете экземпляр, с помощью:

<xforms:instance xmlns="" id="instanceData">

(И если это проблема, мой совет не использовать декларации пространства имен по умолчанию. ВсегдаВместо этого объявите xmlns:xhtml="http://www.w3.org/1999/xhtml" и везде используйте префикс xhtml.)

0 голосов
/ 03 марта 2011

Во-первых: Это может быть опечатка в любом случае, чтобы указать, что у xml неправильный конец узла

<service>

Во-вторых: ваш XPATH очень верен, но когда вы анализируете его, вам нужно выполнить итерацию по результирующему набору, как если бы это была последовательность узлов, а не одно значение.

например) в JDOM:

В ваших XForms вам нужно перебрать набор результатов, чтобы получить список фруктов.

если вы хотите только названия фруктов, тогда вы можете попробовать

instance('instanceData')/fruits/fruit/fruit-name/text()
...