2010-01-27 5 views
4

J'essaie d'apprendre XPath, et j'ai du mal à faire une recherche imbriquée (using contains).xpath: contains() pour un groupe de réponses

Plus précisément, on m'a donné la question suivante:

Il y a une liste d'auteurs, et une liste de livres, selon la DTD suivante:

<!ELEMENT db1 (book*, author*)> 
<!ELEMENT book (title)> 
<!ATTLIST book 
    bid ID #REQUIRED 
    authors IDREFS #REQUIRED 
> 
<!ELEMENT title (#PCDATA)> 
<!ELEMENT author (#PCDATA)> 
<!ATTLIST author 
    aid ID #REQUIRED 
> 

Ecrire une expression XPath qui retourne la nombre d'auteurs qui ont écrit des livres. Il est possible de supposer qu'il n'y a pas deux identifiants d'auteur qui se contiennent les uns les autres.

J'ai essayé beaucoup de choses, mais je reçois toujours une erreur de "Trop d'éléments dans les contenus". Je suis en train de lancer quelque chose comme ceci:

//author/@aid[contains(//book/@authors/string(.), string(.))] 

J'utilise le fichier XML suivant comme exemple:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE db1 SYSTEM "C:\blabla\db1.dtd"> 
<db1> 
<book authors="a1 a3 a4" bid="b1"> 
<title>Book 1</title> 
</book> 
<book authors="a1 a2 a3" bid="b2"> 
<title>Book 2</title> 
</book> 
<book authors="a4" bid="b3"> 
<title>Book 3</title> 
</book> 
<author aid="a1"></author> 
<author aid="a91"></author> 
<author aid="a2"></author> 
<author aid="a88"></author> 
<author aid="a3"></author> 
<author aid="a4"></author> 
<author aid="a5"></author> 
<author aid="a6"></author> 

</db1> 

La réponse attendue devrait être

a1 a2 a3 a4 

Un conseil?

Merci.

+0

Pouvez-vous fournir le document XML et le code que vous utilisez pour tester votre expression XPath? –

+0

@AJ, j'ai ajouté l'exemple que j'utilisais. Espérons que cela aide .... – Anna

+0

Expliquer la réponse attendue? Voulez-vous renvoyer les @ auteurs de l'enchère = 1? Ou voulez-vous retourner une liste unique d'auteurs avec les livres correspondants? –

Répondre

2

J'ai trouvé la réponse que je recherchais. Ce n'est pas si difficile en fait, il est juste nécessaire de se familiariser avec la fonctionnalité 'id' de XPath.

La requête XPath pour cela est: count(id(//book/@authors))

La liste des auteurs peuvent être donnés en id(//book/@authors). Notez que cette XQuery retourne le xml complet (et non les noms seulement):

<author aid="a1"/> 
<author aid="a2"/> 
<author aid="a3"/> 
<author aid="a4"/> 

Voir reference.

La fonction contains ne s'applique pas dans ce cas, mais heureusement, ce n'est pas vraiment nécessaire.

La fonction id sélectionne les éléments par leur ID unique. Lorsque l'argument à id est de type node-set, le résultat est l'union du résultat de l'application de l'id à la valeur de la chaîne de chacun des nœuds de l'argument node-set. Lorsque l'argument à id est de tout autre type, l'argument est converti en une chaîne comme si un appel à la fonction chaîne; la chaîne est divisée en une liste de jetons séparés par des espaces (un espace est une séquence de caractères correspondant au S de production); le résultat est un ensemble de nœuds contenant les éléments du même document que le nœud de contexte qui ont un ID unique égal à l'un des jetons de la liste.

+0

Cette requête ne renvoie pas le résultat attendu. Qu'est-ce qui se passe avec ça? –

+0

J'ai édité l'exemple un peu pour clarifier ce que j'avais en tête. J'espère que c'est moins déroutant maintenant. – Anna

+0

heureux que vous ayez compris cela! Ce n'était pas la direction dans laquelle je l'ai prise ... mais cela fonctionne totalement pour moi comme vous l'avez fait. J'ai construit un harnais de test simple en python en utilisant libxml2, je pourrais le poster si quelqu'un veut le voir ... –

Questions connexes