首页 > 解决方案 > 如何将几个正则表达式组合成一个?

问题描述

下午好,

我有 3 个以下正则表达式,我需要将它们合并为一个:

我怎样才能做到这一点?所有最好的沃伊切赫

标签: xpath

解决方案


一些想法:

  • 以 开头的 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))

推荐阅读