Как найти предка или себя, который является дочерним элементом элемента с определенным атрибутом? - PullRequest
4 голосов
/ 03 декабря 2010

Я работаю с очень общей структурой XML, где все является элементом (ну, в любом случае, все, что относится к этому вопросу).

Основываясь на знании элемента item, на котором я сейчас нахожусь, и элемента item, который является родителем искомого узла, мне нужно найти элемент. У меня есть рабочий xpath, но он довольно ресурсоемкий, и я ищу что-то более элегантное и более дешевое.

Ключ элемента = узел является родителем элемента, который я ищу (хотя на самом деле он не является дочерним для корня документа)

XML:

<root>
    <item key="a">
        <item key="b">
            <item key="c">
                <item key="d"/>
            </item>
        </item>
        <item key="e">
            <item key="f">
                <item key="g"/>
            </item>
        </item>
    </item>
</root>

Фактический XML намного глубже и с гораздо большим количеством ветвлений.

Так, например, если я нахожусь с элементом с ключом = g, e или f, мне нужно вернуть элемент с ключом = e. Если я нахожусь на предмете с ключом b, c или d, мне нужно вернуть предмет с ключом = b.

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

current()
   /ancestor-or-self::item[@key='a']
      /item[descendant-or-self::* = current()]

Есть ли более простой способ сделать это, имея в виду, что я знаю только 1) узел, на котором я нахожусь, и 2) ключевой атрибут родителя искомого узла?

Просто ради подробностей: XML генерируется Sitecore, на самом деле я не использую функцию current (), я использую параметр sc_currentitem, чтобы установить начальный узел, с которого нужно начать обработку.

Заранее спасибо.

1 Ответ

6 голосов
/ 03 декабря 2010

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

ancestor-or-self::*[parent::item[@key='a']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...