2010-12-14 7 views
4

donné un échantillon de test de mon fichier xml est illustré ci-dessous:XQuery noeud texte de retour si elle contient mot-clé

test.xml

<feed> 
    <entry> 
    <title>Link ISBN</title> 
    <libx:libapp xmlns:libx="http://libx.org/xml/libx2" /> 
    </entry> 
    <entry> 
    <title>Link Something</title> 
    <libx:module xmlns:libx="http://libx.org/xml/libx2" /> 
    </entry> 
</feed> 

Maintenant, je veux écrire un XQuery qui trouvera tous <entry> éléments qui ont <libx:libapp> comme un enfant. Ensuite, pour toutes ces entrées, renvoyez le titre si le titre contient un mot clé donné (tel que Lien). Donc, dans mon document XML, le xquery devrait renvoyer "Link ISBN".

Mon échantillon XQuery est illustré ci-dessous:

samplequery.xq (ici DOC_NAME est le fichier xml ci-dessus et libapp_matchkey est un mot clé comme 'lien')

declare namespace libx='http://libx.org/xml/libx2'; 
declare variable $doc_name as xs:string external; 
declare variable $libpp_matchkey as xs:string external; 
let $feeds_doc := doc($doc_name) 

for $entry in $feeds_doc/feed/entry 
    (: test whether entry has libx:libapp child and has "Link" in its title child :) 
    where ($entry/libx:libapp and $entry/title/text()[contains(.,$libapp_matchkey)]) 
    return $entry/title/text() 

Cette XQuery retourne null au lieu du résultat attendu 'Link ISBN'. Pourquoi donc?

+0

J'ai remplacé 'food_doc' $ déclaration'/', corrigé la' $ libapp_matchkey' faute de frappe, et runned avec succès avec votre échantillon d'entrée . –

+0

Bonne question, +1. Voir ma réponse pour une solution one-liner courte et naturelle :) –

Répondre

6

Je veux écrire un XQuery qui trouver tous les éléments qui ont comme un enfant. Ensuite, pour , toutes ces entrées renvoient le titre si le titre contient un mot clé donné (tel que Lien).

Il suffit d'utiliser:

/*/entry[libx:libapp]/title[contains(.,'Link')]/text() 

Emballage cette expression XPath dans XQuery nous obtenons:

declare namespace libx='http://libx.org/xml/libx2'; 
/*/entry[libx:libapp]/title[contains(.,'Link')]/text() 

lorsqu'il est appliqué sur le document XML fourni:

<feed> 
    <entry> 
    <title>Link ISBN</title> 
    <libx:libapp xmlns:libx="http://libx.org/xml/libx2" /> 
    </entry> 
    <entry> 
    <title>Link Something</title> 
    <libx:module xmlns:libx="http://libx.org/xml/libx2" /> 
    </entry> 
</feed> 

le résultat recherché, est produit correct:

Link ISBN 
+0

Je vois l'exception suivante lorsque j'essaie ceci: pour $ entry dans $ feeds_doc/atom: feed/atom: entrée return/*/$ entrée [libx: libapp]/title [contains (., 'Link')]/text() Exception dans le thread "main" java.io.IOException: Arrêté à la ligne 9, colonne 13: [XPDY0002] Aucun élément de contexte défini pour 'root()'. – sony

+0

@sony: Il n'y a pas de "$ entry" dans ma réponse - Vous pouvez obtenir une exception possible sur tout ce qui n'est pas ma réponse, mais pourquoi signalez-vous ceci comme un commentaire ici? –

+1

À quoi fait référence/*? Je veux dire les éléments d'entrée sont à l'intérieur élément dans le document. Comment faites-vous référence à $ feeds_doc/feed – sony

Questions connexes