2010-04-27 1 views
1

У меня есть XML-представление документа, который имеет вид:Почему модуль Perl XML :: LibXML (в частности, XPathContext) не оценивает позиции?

<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: неверная ошибка контекстной позиции». Я читать на docs и нашел этот интересный лакомый

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

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


Re: @Dan

Цените ответ. Я попробовал ваш пример, и это сработало. В моем коде я предполагал, что контекст является узлом, представленным моей переменной perl. Итак, $ sentence-> find ('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()"); 

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

ответ

2

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, вы хотите его положение относительно чего?

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

+0

То, что я действительно ищу, - это положение узла, который у меня уже есть. Мой отредактированный вопрос дает больше информации о проблеме? –