XPATH / XSLT - сопоставление только первого следующего предка с данным атрибутом - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь написать выражение xpath, которое соответствует только первому следующему предку, который содержит данный атрибут, но я не могу найти соответствующий xpath. Упрощенный пример XML:

<root>
  <node href="L1_value_1">
    <node href="L2_value_1">
      <node href="L3_value_1">
        <node href="L4_value_1"/>
      </node>
    </node>
    <node/>
    <node href="L2_value_2"/>
    <node href="L2_value_3"/>
  </node>
  <node href="L1_value_2"/>
  <node href="L1_value_3"/>
</root>

Например, если я нахожусь на узле, содержащем href = "L4_value_1", я хочу вернуть только узел с href = "L2_value_2". К сожалению, я не могу найти правильный xpath. Я пробовал следующее:

<xsl:apply-templates select="ancestor::*/following-sibling::*[@href][1]"/>

- возвращает первое совпадение после родственного брата на каждый уровень предка, т. Е. Узлы, содержащие L2_value_2 и L1_value_2 в примере.

<xsl:apply-templates select="ancestor::*[1]/following-sibling::*[@href][1]"/>

- возвращает первое совпадение после родственного брата на только родительский уровень, т. Е. Ничего в примере.

Как я могу пройти по дереву настолько далеко, насколько это необходимо, и только захватить первый матч?

1 Ответ

0 голосов
/ 06 сентября 2018

Для первого выражения вам нужно написать это здесь ...

 <xsl:apply-templates select="(ancestor::*/following-sibling::*[@href])[1]"/>

Но, возможно, вам лучше использовать ось following, а не following-sibling, тогда вы можете сделать это ...

<xsl:apply-templates select="following::*[@href][1]"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...