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"]
我怎样才能做到这一点?所有最好的沃伊切赫
解决方案
一些想法:
- 以 开头的 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))
推荐阅读
- javascript - 如何在 puppeteer 中自动执行页面上的 js 函数?
- jquery - JQuery DatePicker没有改变语言
- mysql - 通过 MySQL 计算字符串中的出现次数
- reactjs - 为ios构建本机反应后出错
- php - 正在显示缓存的图像,任何人都可以给我解决方案
- javascript - 表示下一个抛出错误,因为下一个未定义
- android - Android Auto 文本大小不起作用
- javascript - JS:在新页面打开时播放音频
- c# - WPF C#在鼠标移动时绘制平滑矩形而不缺少黑色外部区域
- html - HTML 调整页面大小以适应任何尺寸的显示器