代码之家  ›  专栏  ›  技术社区  ›  mclark1129

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

  •  3
  • mclark1129  · 技术社区  · 14 年前

    我试图通过使用XPath查询来解析XML节点中的字符串,该查询要求去掉一个子字符串并读取剩余的值。子字符串可能在获取值之前和之后都有动态数量的空白,因此在XPath中使用某种indexOf函数会很有帮助。我尝试在之后使用子字符串,但是很有可能XPath是1.0,根据 this post 可能会让这件事更难完成。下面是我试图解析的XML的一个示例:

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

    我试图得到字符串中的值7,这似乎可以通过子字符串after和normalize空间的组合来实现。我不完全确定我是否正确地使用了它,因为无论我以何种方式使用它,结果要么是一个空值,要么是整个字符串,子字符串没有被删除。

    我能够返回整个值(两个魔鬼中的较小者)的方法是:

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

    我希望返回'7',是否有人告诉我语法有问题,或者如果有其他方法我应该用来完成我想要的任务?

    谢谢,

    迈克

    1 回复  |  直到 8 年前
        1
  •  4
  •   Dimitre Novatchev    14 年前

    我能把所有的 值(两个魔鬼中的较小者)为: /myField[substring-after(.,'StringToParse')] , 有人能告诉我我在做什么吗 错误的

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

    1. myField 不是文档中的顶部元素,此表达式要求选择顶部元素 这个元素的名字是 麦菲尔德 . 如果根据所提供的XML文档进行求值,则不会选择节点,因为所提供的XML文档中的顶部元素名为 root .

    2. substring-after() 在一个 . 这意味着 麦菲尔德 根据调用的值选择 子字符串-after() ,已转换为布尔值。这显然是你想要的——你不想要一个节点——你想要一个字符串!

    解决方案 :

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

    评估为

    "        7"
    

    更好的解决方案可能是

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

    结果是

    "7"