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

时间:2010-10-19 00:55:02

标签: xml search xpath substring

我尝试使用XPath查询解析XML节点中的字符串,该查询要求我删除子字符串并读取剩余值。在我可以获得该值之前,子字符串可能在它之前和之后具有动态数量的空白,因此在XPath中使用某种indexOf函数会很有帮助。我正在尝试使用substring-after,但XPath很可能是1.0,根据this post可能会使这更难实现。以下是我尝试解析的XML示例:

<root>
   <myField>     StringToParse        7</myField>
</root>

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

我能够返回整个值(两个邪恶中较小的一个)的方式是:

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

我希望能回复'7'任何人都可以让我知道我的语法错误,或者我是否应该用另一种方法来完成我想要的工作?

谢谢,

麦克

1 个答案:

答案 0 :(得分:4)

  

我能够返回整个的方式   价值(两个邪恶中较小的一个)是:   /myField[substring-after(.,'StringToParse')],   我希望能回归'7'   任何人都可以让我知道我在做什么   错

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

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

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

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

  3. <强>解决方案

    substring-after(/*/myField, 'StringToParse')
    

    评估为(不带引号):

    "        7"
    

    更好的解决方案可能是

    normalize-space(substring-after(/*/myField, 'StringToParse'))
    

    评估为

    "7"