2015-01-30 4 views
1

Найти определенный тег внутри родительского тега с помощью XPath:Xpath для извлечения всех тегов внутри родительского

Пример ввода:

<Table> 
    <Tbody> 
     <Row> 
      <cell><para> <ref> </ref> <ref> </ref> </para> </cell> 
     </Row> 
     <Row> 
      <cell><para> <a1> </a1><ref> </ref> </para> </cell> 
     </Row> 
     <Row> 
      <cell><para> <ref> </ref></para> </cell> 
     </Row> 
     <Row> 
      <cell><para> <b1> </b1></para> </cell> 
     </Row> 
     <Row> 
      <cell><para> <b1> </b1> <c1> </c1></para> </cell> 
     </Row> 
     <Row> 
      <cell><para> <ref> </ref> <c1> </c1></para> </cell> 
     </Row> 
    <Thead> 

Ожидаемый результат:

  • cell1-пара он должен вернуть 0
  • cell2-para следует возвращать 1
  • cell3-para it shoul d вернуть 0
  • cell4-пункт он должен вернуть 1
  • cell5-пункт он должен вернуть 2
  • cell6-пункт он должен вернуть 1

Как узнать счетчик, не реф тега внутри клетка?

Возможно, несколько тегов внутри пара. Имя может быть любым. Но нам нужно проверить только один.

ответ

1

XPath не может возвращать результаты для каждого элемента para - это то, что вы должны делать на языке более высокого уровня. XPath встроен в (например, XSLT, XQuery, Java, PHP, Python, Perl ...) ,

Чтобы получить один результат, для входа, как

<cell><para> <ref> </ref> <ref> </ref> </para> </cell> 

использовать следующее выражение XPath

count(//para/*[not(self::ref)]) 

, который, в данном случае, будет давать

0 

EDIT: Это справедливо только для XPath 1.0, как отметил Шон Б. Дуркин. Это возможно в Xpath 2.0 и 3.0, где функции XPath могут быть шагами оси и где последовательности всегда оцениваются полностью. См. Sean's answer для решения XPath 2.0.

+0

Спасибо за ответ. – ThirumalMarugan

+0

Вы должны квалифицировать свое утверждение «XPath не способен ...». Версия 2.0 может сделать это довольно легко. –

+0

@ SeanB.Durkin Да, вы правы, конечно. Я отредактирую ответ за секунду. –

1

При использовании XPath 2.0 или 3.0, и узел фокусировки является родителем таблицы, то следующее выражение ...

Table/Tbody/Row/cell/para/count(decendant::ref) 

... применительно к данному документу ввода образца будет оценивать в этой последовательности хз: целое ...

(0,1,0,1,2,1) 

Просто для удовольствия, здесь является равноценной альтернативой выражение ...

for $p in Table/Tbody/Row/cell return count($p//ref) 
Смежные вопросы