2010-04-27 1 views
1

J'ai une représentation XML d'un document qui a la forme:Pourquoi le module XML :: LibXML de Perl (spécifiquement XPathContext) n'évalue-t-il pas les positions?

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

J'essaie d'utiliser XML :: LibXML pour analyser un document et obtenir la position des phrases. L'erreur que j'obtiens est "Erreur XPath: erreur de position de contexte non valide". Je l'ai lu sur le docs et trouvé cette friandise intéressante

évaluer la position de la fonction XPath() dans le contexte initial déclenche une erreur XPath

Mon problème est que je ne sais pas quoi faire avec cette information. Quel est le «contexte initial»? Comment faire pour que le moteur suive automatiquement la position du contexte?


Re: @ Dan

Appréciez la réponse. J'ai essayé votre exemple et cela a fonctionné. Dans mon code, je supposais que le contexte était le nœud représenté par ma variable perl. Donc, $ phrase-> find ('position()') je voulais être './position()'. En dépit de voir un exemple de travail, je ne peux toujours pas faire

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

Je peux cependant faire

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

peut positionner() ne peut être utilisé pour limiter une requête comme vous?

Répondre

2

position() fonctionne dans LibXML. Par exemple, voir

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

Ceci imprimera Hello avec vos données d'échantillon.

Mais comme vous l'utilisez ici, il n'y a pas de contexte. Pour chaque sentence_node, vous voulez sa position par rapport à quoi?

Si vous recherchez des nœuds spécifiques par position, utilisez un sélecteur comme ci-dessus, c'est le plus simple.

+0

Ce que je cherche vraiment, c'est la position d'un nœud que j'ai déjà. Est-ce que ma question éditée donne plus de perspicacité au problème? –

Questions connexes