XPATH Выбрать все атрибуты, кроме атрибута «Один на определенный элемент» - PullRequest
0 голосов
/ 30 августа 2018

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

Учитывая следующий пример:

<root> 
  <structs id="123"> 
    <struct> 
      <comp> 
        <data id="asd"/> 
      </comp> 
    </struct> 
  </structs> 
</root>

Я хочу выбрать все атрибуты id, кроме одного в /root/structs/struct/comp/data

Обратите внимание, что Xml может отличаться. Это означает, что я действительно хочу: учитывая любое дерево XML, я хочу выбрать все атрибуты id, за исключением атрибута элемента /root/structs/struct/comp/data

Я попробовал следующее:

//@id[not(ancestor::struct)] Это вроде работало, но я хочу указать полный путь к оси предка, чего я не смог

//@id[not(contains(name(), 'data'))] Это не сработало, поскольку селектор имени возвращает имя базового узла, который является атрибутом, а не его родительским элементом

1 Ответ

0 голосов
/ 30 августа 2018

Следующее должно достичь того, что вы описываете:

//@id[not(parent::data/parent::comp/parent::struct/parent::structs/parent::root)]

Как видите, он просто проверяет снизу вверх, соответствует ли родительский атрибут id пути root/structs/struct/comp/data.

Я думаю, что этого должно быть достаточно для ваших нужд, но это не на 100% гарантирует, что родитель находится по пути /root/structs/struct/comp/data, потому что это может быть, например, по пути /someOtherHigherRoot/root/structs/struct/comp/data. Я предполагаю, что это не возможный сценарий в вашей структуре XML, но если вам нужно было проверить это, вы могли бы сделать это:

//@id[not(parent::data/parent::comp/parent::struct/parent::structs/parent::root[not(parent::*)])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...