Захват узлов, которые не являются потомками других узлов, исключая текущий контекст - PullRequest
2 голосов
/ 11 апреля 2011

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

<root>
    <my_element>
        <my_element>
            Some Text
        </my_element>
    </my_element>
</root>

Я знаю, что уже могу делать то, что хочу, используя этот xpath:

Context: /
xPath: descendant::my_element[not(ancestor::my_element)]

Что бы вернуть этот набор результатов:

<root>
    [<my_element>]
        <my_element>
            Some Text
        </my_element>
    [</my_element>]
</root>

Это ожидаемое поведение того, что я хочу. Но я хочу иметь возможность изменить контекст на:

/my_element

И получите этот набор результатов:

<root>
    <my_element>
        [<my_element>]
            Some Text
        [</my_element>]
    </my_element>
</root>

Я старался изо всех сил при просмотре документов xPath, и я почти ничего не придумал. Может кто-то здесь может дать некоторое представление?

Спасибо!

  • редактировать - Я хочу иметь возможность выбрать потомка my_element, который не является предком my_element, за исключением узла контекста.

  • изменить еще раз - Для дальнейшего объяснения.

Я хочу получить запрос xpath, который выбирает узлы my_element, если узел не является дочерним для my_element. Но если для контекста xpath задан узел my_element, я не хочу, чтобы этот узел учитывался в выражении. Таким образом, xpath будет соответствовать следующему узлу my_element, хотя на самом деле это дочерний элемент my_element.

  • изменить еще раз -

Вот еще несколько примеров.

<root>
    <a>
        <a>
            <b>
                <a>
                    Hello!
                </a>
            </b>
            <a>
                <b>
                    Hello Again
                    <a>
                        Sub
                    </a>
                </b>
            </a>
        </a>
    </a>
</root>

Context: /root/
Desire: Want to grab all A nodes, so long as they aren't a descendant of A

Result:
<root> == Context
    [<a>]
        <a>
            <b>
                <a>
                    Hello!
                </a>
            </b>
            <a>
                <b>
                    Hello Again
                    <a>
                        Sub
                    </a>
                </b>
            </a>
        </a>
    [</a>]
</root>

Context: /root/a/
Desire: Want to grab all A nodes, so long as they aren't a descendant of A, not including the context /root/a/

Result:
<root>
    <a> == Context
        [<a>]
            <b>
                <a>
                    Hello!
                </a>
            </b>
            <a>
                <b>
                    Hello Again
                    <a>
                        Sub
                    </a>
                </b>
            </a>
        [</a>]
    </a>
</root>

Context: /root/a/a/
Desire: Want to grab all A nodes, so long as they aren't a descendant of A, not including the context /root/a/a/

Result:
<root>
    <a>
        <a> == Context
            <b>
                [<a>]
                    Hello!
                [</a>]
            </b>
            [<a>]
                <b>
                    Hello Again
                    <a>
                        Sub
                    </a>
                </b>
            [</a>]
        </a>
    </a>
</root>

Context: /root/a/a/a/
Desire: Want to grab all A nodes, so long as they aren't a descendant of A, not including the context /root/a/a/a/

Result:
<root>
    <a>
        <a>
            <b>
                <a>
                    Hello!
                </a>
            </b>
            <a> == Context
                <b>
                    Hello Again
                    [<a>]
                        Sub
                    [</a>]
                </b>
            </a>
        </a>
    </a>
</root>

Надеюсь, это прояснит мои желания. Спасибо всем, кто пытается!

Ответы [ 2 ]

0 голосов
/ 11 апреля 2011

Я думаю, вы можете попасть в общую ловушку.В выражении XPath / root / my_element для ваших данных будет выбран только один элемент - самый внешний узел my_element.Но этот узел все еще привязан к своим родителям, братьям и сестрам и детям.Когда вы отображаете результат выбора, узел часто будет отображаться вместе со своими дочерними элементами (в действительности, со всеми потомками) - не потому, что XPath выбрал дочерние элементы, а потому, что это удобный способ отобразить один выбранный узел.

С другой стороны, я снова прочитал вопрос, и, возможно, я ошибаюсь - я догадался об этом по особой записи, которую вы использовали для отображения результатов вашего выражения XPath.

Выражение / my_element выберет my_element, только если его родитель является узлом документа в корне дерева, что никогда не будет иметь место с вашим вводом, каким бы ни был ваш контекстный узел.Конечно, вы можете скопировать поддерево с корнем my_element в новый документ, и в этом случае это выражение будет работать.

0 голосов
/ 11 апреля 2011

Использование :

//my_element[not(.//my_element)]

Выбирает все элементы с именем my_element, которые не имеют my_element потомков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...