Подстановочные знаки XPath и использование() функций

У меня проблема с использованием XPath и содержит функцию. Представьте пример 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>

Итак, я хочу вернуть все тексты <Name> в <Data> node со следующими критериями:

  • doc//Test/Name должен содержать текст "Pre"

  • doc//Test/Type должен быть "известен"

Мне нужен такой запрос, но до сих пор я не мог справиться с ним

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

Любая помощь и советы будут оценены.

Ответ 1

Попробуйте следующее:

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

Ниже приведен рабочий пример, реализованный в Javascript, чтобы воспользоваться Фрагментами кода StackOverflow Runnable

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>