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' 谁能告诉我我在语法上做错了,或者是否有我应该使用的替代方法来完成我想要的?
谢谢,
麦克风
我能够返回整个值(两个邪恶中的较小者)的方式是:
/myField[substring-after(.,'StringToParse')],我希望它会返回 '7' 谁能让我知道我做错了
你很接近,但表达式至少有两个问题:
/myField[substring-after(.,'StringToParse')]
myField不是文档中的顶部元素,并且此表达式请求选择顶部元素并且此元素的名称为myField。如果针对所提供的 XML 文档进行评估,则不会选择任何节点,因为所提供的 XML 文档中的顶部元素名为root。
对函数的调用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)