Могу ли я рефакторинг, чтобы избежать "self ::" и "parent ::"?

xml xpath xpath-1.0

24 просмотра

2 ответа

Я хочу извлечь //preи //codeэлементы, но исключить //pre/code. Например:

<root>
    <pre>foo
bar
baz
ignore meselect me

Я хочу получить четыре элемента:

  1. <pre>foo
  2. &lt;code&gt;bar&lt;/code&gt;
  3. <pre>baz</pre>
  4. &lt;code&gt;select me&lt;/code&gt;

(А я конкретно не хочу foo)

Следующий xpath, кажется, добивается цели:

//*[(self::pre or self::code) and not (self::code and parent::pre)]

Я не знаю, правильный ли это подход, но, похоже, он работает.

Есть ли менее подробный способ выразить это (например, который не требует self::и parent::)?

Автор: ᴇʟᴇvᴀтᴇ Источник Размещён: 26.10.2019 09:23

Ответы (2)


3 плюса

Решение

Попытка устранить self::и parent::вообще не является похвальной целью. Возможно, вы ищете аббревиатуру этих осей в надежде, что они позволят сократить эквивалентную форму выражения.

Это понятно, учитывая, например, что дочерняя ось,

/child::a/child:b

может быть более кратко написано

/a/b

Каковы параллельные сокращения для self::и parent::?

  • self::node() может быть сокращено .
  • parent::node() может быть сокращено ..

Тем не менее, они более полезны в тех случаях, когда имя узла контекста или его родителя несущественно - в вашем случае это не так. (Например, ./используется для относительного пути, а не /для абсолютного пути; ../@attrиспользуется для ссылки на attrатрибут родительского элемента, а не @attrна элемент контекста.)

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

Автор: kjhughes Размещён: 14.03.2016 03:45

2 плюса

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

Обратите внимание, однако, что ваше условие имеет больше операндов, чем нужно. Вы можете выразить то же самое, как это:

//*[self::pre or (self::code and not(parent::pre))]
Автор: JLRishe Размещён: 14.03.2016 04:03
Вопросы из категории :
32x32