【问题标题】:xpath from string来自字符串的 xpath
【发布时间】:2011-02-22 07:08:48
【问题描述】:

我正在尝试从字符串文字执行 xpath 表达式。我从一些变量创建我的 xpath,所以我无法预先计算它们。我最终得到了这样的结果:

count(concat("//sales:", "$variable", "Available"))

这会导致错误:

Can not convert #STRING to a NodeList!

我认为如果我能以某种方式evaluate() concat 的结果就足够了,因此它将成为实际的 NodeList。是否有适当的功能来执行此操作?

我正在 Apache Camel 中进行此文本操作,但这在 IMO 中并不重要。

已编辑:

更准确地说:Apache Camel 作为一个管道工作,XML 穿过它,您可以通过某些方式处理这些 XML——比如根据 XML 的内容或结构强加一些规则。这就是为什么我需要它是动态的。

我的情况是这样的:

  1. 查看xml并获取元素operationName的内容
  2. 在其他文档中搜索由小写 operationName 和字符串文字“Available”构成的元素

所以如果我的 operationName 是 FOOBAR,那么我想检查节点 //sales:foobarAvailable

是否存在

【问题讨论】:

  • 你需要dyn:evaluate,尽管它在实现中的支持很差。
  • 动态评估内部 XPath 表达式?宿主语言不应该在评估之前做那个组合吗?

标签: xml xpath apache-camel


【解决方案1】:

在 XSLT/XPath 版本 3.0 之前不支持动态生成的 XPath 表达式的评估,目前处于早期 WD(工作草案)状态。

如果对 XPath 表达式了解更多,通常可以设计一些解决方案。

因此,如果您更详细地描述您的问题,那么很有可能有人能够提供帮助。

更新:有来自 OP 的新信息:

所以如果我的 operationName 是FOOBAR, 比我想检查的存在 节点//sales:foobarAvailable

这很容易做到:

使用

//sales:*[local-name()
         =
          concat(translate(operationName, $vUpper, $vLower), 'Available')
         ]

其中 $vUpper 和 $vLower 定义为(可以替换为):

'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

'abcdefghijklmnopqrstuvwxyz'

【讨论】:

  • 好的,我添加了更多见解。
  • @Marcin-Cylke:是的,这很容易实现 - 请参阅我的答案的更新。
  • 你的评论很棒,效果很好 - 这样做非常聪明:)
【解决方案2】:

如果您的 XSLT 处理器没有 xx:evaluate 扩展(并且您不能切换到有扩展),那么在某些情况下可能有用的另一种技术是编写元样式表——样式表创建或修改另一个样式表。然后在某种管道中运行这两个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2011-09-11
    • 2012-09-10
    相关资源
    最近更新 更多