Как я могу объединить несколько регулярных выражений в одно? - PullRequest
0 голосов
/ 08 февраля 2019

Добрый день,

У меня есть 3 следующих регулярных выражения, которые мне нужно объединить в одно:

  • //*[local-name()!="shipping-methoc"][*[local-name()="online-flag"]="true"]/*[local-name()!="description"]
  • //*[local-name()!="shipping-methoc"][*[local-name()="online-flag"]="true"]/*[local-name()!="title"]
  • //*[local-name()!="shipping-methoc"][*[local-name()="online-flag"]="true"]/*[local-name()!="flag"]

Как я могу это сделать?Всего наилучшего, Войцех

1 Ответ

0 голосов
/ 09 февраля 2019

Некоторые мысли:

  • Запуск выражения XPath с // означает, что движок будет искать все элементы в документе.Это крайне неэффективно.
  • Лучший способ сформулировать выражение XPath может зависеть от того, где вы его используете.Это соответствует шаблону?Это в утверждении выбора?Это где-то еще?Какой другой контекст вы можете нам дать?
  • Еще одним фактором является то, какую версию XSLT / XPath вы используете.Некоторые функции, доступные в XLST v2.0 и более поздних версиях, позволяют использовать более короткие выражения.

Как вы, очевидно, поняли, эти три строки имеют почти идентичные выражения XPath, где единственным отличием является последнее условие в конце,С минимальными изменениями в вашем примере кода мы могли бы объединить эти три разных последних условия в одно выражение.Это должно работать даже в XSLT 1.

  • //*[local-name()!='shipping-methoc'][*[local-name()='online-flag']='true']/*[local-name()!='description' and local-name()!='title' and local-name()!='flag']

Если вы можете использовать XSLT 2 или новее, вы получите доступ к дополнительным параметрам как для положительных, так и для отрицательных совпадений.

Я предполагаю, что вы используете local-name(), что вас не волнуют префиксы пространства имен.Для положительных совпадений вы можете использовать *: в качестве префикса для «любого пространства имен».

  • //*[local-name()!='shipping-methoc'][*:online-flag='true']/*[local-name()!='description' and local-name()!='title' and local-name()!='flag']

Вы также можете использовать ключевое слово except какдополнительная опция для отрицательных совпадений.

  • //(* except *:shipping-methoc)[*:online-flag='true']/(* except (*:description | *:title | *:flag))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...