XPath通配符和contains()函数的使用

11

我在使用XPath和contains函数时遇到了问题。想象一下以下的XML示例:

   <doc>  
     <Test>
       <Name>1 Pre Histoy</Name>
       <Type>Known</Type>
       <Data>
          <Name>Dinasor</Name>
          <Name>Fish</Name>
      </Data>
      </Test>

      <Test>
        <Name>1 Post Histoy</Name>
        <Type>Known</Type>
        <Data>
          <Name>Human</Name>
          <Name>Dog</Name>
        </Data>
     </Test>

      <Test>
        <Name>1 Post Histoy</Name>
        <Type>UNKNOWN</Type>
        <Data>
          <Name>Human</Name>
          <Name>Dog</Name>
        </Data>
     </Test>  

  </doc>

我想要做的是返回<Data>节点中所有<Name>文本,满足以下条件:

  1. doc//Test/Name应包含 "Pre" 文本。

  2. doc//Test/Type应为 "Known"。

我需要的是像这样的查询,但迄今为止我无法管理它

/doc//Test[Name contains(.,'Pre') and Type='Known']/data//Name

非常感谢您的帮助和建议。


最后一个字母不应该是大写的D吗? - BoltClock
我想是这样的,如果你把第一个字符算作两端之一的话... - Michael Kay
抱歉,那只是一个例子。大写字母D也不会做任何事情。 - Dumbo
1个回答

18

试试这个:

/doc/Test[contains(Name, "Pre") and Type="Known"]/Data/Name

这里有一个使用Javascript实现的工作示例,可以利用StackOverflow的可运行代码片段

function fu(path){
  var output = "";
  var results =  document.evaluate(path, document, null, XPathResult.ANY_TYPE  , null);
  while(nextResult = results.iterateNext()){ output += nextResult.outerHTML + "\n"; }
  return output;
}

document.body.innerText = fu('//doc/Test[contains(Name, "Pre") and Type="Known"]/Data/Name');
<doc>  
 <Test>
   <Name>1 Pre Histoy</Name>
   <Type>Known</Type>
   <Data>
      <Name>Dinasor</Name>
      <Name>Fish</Name>
  </Data>
  </Test>

  <Test>
    <Name>1 Post Histoy</Name>
    <Type>Known</Type>
    <Data>
      <Name>Human</Name>
      <Name>Dog</Name>
    </Data>
 </Test>

  <Test>
    <Name>1 Post Histoy</Name>
    <Type>UNKNOWN</Type>
    <Data>
      <Name>Human</Name>
      <Name>Dog</Name>
    </Data>
 </Test>  

  </doc>


@Jon:谢谢!这是我第二个XPath答案 :) 链接 - BoltClock
显然你比我学得更快 ;) - Jon
我为了同样的原因进行了测试,它起作用了。谢谢!我的是/PlaceSearchResponse/result[contains(name,'Bimeks')]/geometry。 - Günay Gültekin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接