为什么Perl的XML :: LibXML模块(特别是XPathContext)不能评估位置?

时间:2010-04-27 17:48:01

标签: perl position xml-libxml

我有一个文档的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错误:无效的上下文位置错误”。我已经阅读了docs并发现了这个有趣的花絮

  

在初始上下文中评估XPath函数position()会引发XPath错误

我的问题是我不知道如何处理这些信息。什么是'初始背景'?如何让引擎自动跟踪上下文位置?


回复:@Dan

欣赏答案。我试过你的例子,但它确实奏效了。在我的代码中,我假设上下文是我的perl变量表示的节点。所以,$ sentence-&gt; 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()");

只能使用position()来限制查询吗?

1 个答案:

答案 0 :(得分: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,您希望其位置相对于什么?

如果您要按位置查找特定节点,请使用我上面的选择器,这是最简单的。