【问题标题】:Why doesn't Perl's XML::LibXML module (specifically XPathContext) evaluate positions?为什么 Perl 的 XML::LibXML 模块(特别是 XPathContext)不计算位置?
【发布时间】:2011-02-12 23:53:13
【问题描述】:

我有一个具有以下形式的文档的 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

欣赏答案。我试过你的例子,它奏效了。在我的代码中,我假设 context 是我的 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()");

position() 只能像你一样用来限制查询吗?

【问题讨论】:

    标签: perl position xml-libxml


    【解决方案1】:

    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,您希望它的位置相对于什么?

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

    【讨论】:

    • 我真正要寻找的是我已经拥有的节点的位置。我编辑的问题是否能更深入地了解问题?
    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多