Некоторые мысли:
- Запуск выражения 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))