Почему модуль Perl XML :: LibXML (в частности, XPathContext) не оценивает позиции? - PullRequest
1 голос
/ 27 апреля 2010

У меня есть XML-представление документа в форме:

<response>
  <paragraph>
    <sentence id="1">Hey</sentence>
    <sentence id="2">Hello</sentence>
  </paragraph>
</response>

Я пытаюсь использовать XML :: LibXML для разбора документа и получения позиции предложений.

my $root_node = XML::LibXML->load_xml( ... )->documentElement;
foreach my $sentence_node ( $root_node->findnodes('//sentence')->get_nodelist ){
  print $sentence_node->find( 'position()' );
}

Ошибка, которую я получаю: «Ошибка XPath: недопустимая ошибка положения контекста». Я прочитал на документы и нашел этот интересный кусок

оценка позиции функции XPath () в начальном контексте вызывает ошибку XPath

Моя проблема в том, что я понятия не имею, что делать с этой информацией. Что такое «начальный контекст»? Как заставить движок автоматически отслеживать положение контекста?


Re: @ Dan

Ценю ответ. Я попробовал ваш пример, и это сработало. В моем коде я предполагал, что контекст - это узел, представленный моей переменной perl. Итак, $ предложений -> найти ('position ()'), я хотел быть './position ()'. Несмотря на рабочий пример, я все еще не могу сделать

foreach my $sentence ...
  my $id = $sentence->getAttribute('id');
  print $root_node->findvalue( '//sentence[@id=' . "$id]/position()");

Я могу, однако, сделать

$root_node->findvalue( '//sentence[@id=' . "$id]/text()");

Может ли position () использоваться только для ограничения запроса, как у вас?

1 Ответ

2 голосов
/ 28 апреля 2010

position() работает в LibXML. Например, см.

my $root_node = $doc->documentElement;
foreach my $sentence_node ( $root_node->findnodes('//sentence[position()=2]')->get_nodelist ){
  print $sentence_node->textContent;
}

Это напечатает Hello с вашими данными образца.

Но то, как вы используете это здесь, не имеет контекста. Для каждого sentence_node вы хотите, чтобы его позиция относительно чего?

Если вы ищете конкретные узлы по позиции, используйте селектор, как у меня выше, это проще всего.

...