2010-04-27 85 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錯誤

我的問題是,我不知道該怎麼辦與此信息。什麼是「初始背景」?我如何讓引擎自動跟蹤上下文的位置?


回覆:@丹

欣賞的答案。我試過你的例子,它的工作。在我的代碼中,我假定上下文是由我的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

我真正在尋找的是我已經擁有的節點的位置。我編輯的問題是否可以更深入地瞭解問題? – 2010-06-02 16:26:28

相關問題