Как достать ближайшего предка или ребенка предка с помощью xpath - PullRequest
4 голосов
/ 02 июля 2011

Посмотрите на <bookmark/>.Требуемый вывод, который я хочу, это идентификатор со значением 5

<xsl:value-of select="//bookmark/ancestor::*[@id][1]/@id"/> только дает мне 4

<?xml version="1.0" encoding="UTF-8"?>
<content>
   <section id="1">
        <section id="2"/>
        <section id="3"/>
        <section id="9"/>
    </section>
    <section id="4">
        <section>
            <section id="10"/>
            <section id="5"/>
            <section>
                <bookmark/>
                <section id="6">
                    <section id="7">
                        <section id="8"/>
                    </section>
                </section>
            </section>
        </section>
    </section>
</content>

Ответы [ 3 ]

5 голосов
/ 02 июля 2011

section[@id=5] не является предком из <bookmark>, но предшествует it.

Ось предка содержит предков узла контекста;предки узла контекста состоят из родителя узла контекста и родителя родителя и т. д .;таким образом, ось предка всегда будет включать в себя корневой узел, если только контекстный узел не является корневым узломконтекстный узел в порядке документа, исключая любые предки и исключая узлы атрибутов и узлы пространства имен

Измените ancestor:: на preceding:::

//bookmark/preceding::*[@id][1]/@id
4 голосов
/ 02 июля 2011

Насколько я понимаю вопрос и предоставленный XML-документ заключается в том, что ближайший атрибут id может также встречаться с элементом-предком (section) .

В любом такомесли выражения, использующие только ось preceding:: (как указано в других ответах на этот вопрос), не выбирают ни одного узла.

Одно правильное выражение XPath, которое выбирает атрибут требуемого idis :

    (//bookmark/ancestor::*[@id][1]/@id 
| 
    //bookmark/preceding::*[@id][1]/@id
     )
     [last()]

Если атрибут id также разрешен для самого элемента bookmark, приведенное выше выражение XPath необходимо слегка изменить, чтобы приспособить это:

    (//bookmark/ancestor-or-self::*[@id][1]/@id 
| 
    //bookmark/preceding::*[@id][1]/@id
     )
     [last()]

Примечание: Оси ancestor:: и preceding:: не пересекаются (не перекрываются).

1 голос
/ 02 июля 2011

Используйте предыдущую ось:

<xsl:value-of select="//bookmark/preceding::*[@id][1]/@id"/>
...