使用 substring-after 在 XPath 查询中搜索文本

mcl*_*129 4 xml search xpath substring

我试图通过使用 XPath 查询来解析 XML 节点中的字符串,这要求我去掉一个子字符串并读取剩余的值。在我获得值之前,子字符串前后可能有动态的空格量,因此在 XPath 中使用某种 indexOf 函数会很有帮助。我正在尝试使用 substring-after,但 XPath 很有可能是 1.0,根据这篇文章可能会使这更难实现。以下是我尝试解析的 XML 示例:

<root>
   <myField>     StringToParse        7</myField>
</root>
Run Code Online (Sandbox Code Playgroud)

我试图获得字符串中的值 7,这似乎可以通过 substring-after 和 normalize-space 的某种组合来实现。我不完全确定我是否正确使用它,因为无论我尝试以哪种方式使用它,结果要么是空值,要么是整个字符串,子字符串不会被删除。

我能够返回整个值的方式(两害相权取其轻)是:

/myField[substring-after(.,'StringToParse')]
Run Code Online (Sandbox Code Playgroud)

我希望它会返回 '7' 谁能告诉我我在语法上做错了,或者是否有我应该使用的替代方法来完成我想要的?

谢谢,

麦克风

Dim*_*hev 5

我能够返回整个值(两个邪恶中的较小者)的方式是: /myField[substring-after(.,'StringToParse')],我希望它会返回 '7' 谁能让我知道我做错了

你很接近,但表达式至少有两个问题:

/myField[substring-after(.,'StringToParse')]

  1. myField不是文档中的顶部元素,并且此表达式请求选择顶部元素并且此元素的名称为myField。如果针对所提供的 XML 文档进行评估,则不会选择任何节点,因为所提供的 XML 文档中的顶部元素名为root

  2. 对函数的调用substring-after()位于谓词内这意味着myField将根据调用的值选择命名的顶级节点substring-after(),转换为布尔值。这显然是你想要的——你不想要一个节点——你想要一个字符串!

解决方案

substring-after(/*/myField, 'StringToParse')
Run Code Online (Sandbox Code Playgroud)

评估为(不带引号):

"        7"
Run Code Online (Sandbox Code Playgroud)

更好的解决方案可能是

normalize-space(substring-after(/*/myField, 'StringToParse'))
Run Code Online (Sandbox Code Playgroud)

这评估为

"7"
Run Code Online (Sandbox Code Playgroud)