如何将几个正则表达式组合为一个?

时间:2019-02-08 14:14:10

标签: xpath

下午好,

我有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"]

我该怎么做? 祝一切顺利 Wojciech

1 个答案:

答案 0 :(得分:0)

一些想法:

  • //开始XPath表达式意味着引擎将搜索文档中的每个元素。这效率极低。
  • 构造XPath表达式的最佳方法取决于您在哪里使用它。模板匹配吗?这是在select语句中吗?这是其他地方吗?您还能给我们什么其他背景?
  • 另一个因素是您使用的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))