2010-12-15 56 views
2

J'ai un problème pour filtrer des nœuds spécifiques d'un jackrabbit jcr dans le magnolia.Filtrage des nœuds "MetaData" de xpath-query dans magnolia jcr

quand je soumettons requête suivante: //element(*, standort)//*

je reçois:

33 nodes returned in 18ms 
/standort/Standorte/MetaData 
/standort/Standorte/standort-de 
/standort/Standorte/standort-de/MetaData 
/standort/Standorte/standort-de/Teststandort 
/standort/Standorte/standort-de/Teststandort/MetaData 
/standort/Standorte/standort-de/Hauptwerk-Köln 
/standort/Standorte/standort-de/Hauptwerk-Köln/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-Berlin 
/standort/Standorte/standort-de/Geschäftsstelle-Berlin/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-Frankfurt 
/standort/Standorte/standort-de/Geschäftsstelle-Frankfurt/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-Hamburg 
/standort/Standorte/standort-de/Geschäftsstelle-Hamburg/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-Hannover 
/standort/Standorte/standort-de/Geschäftsstelle-Hannover/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-Köln 
/standort/Standorte/standort-de/Geschäftsstelle-Köln/MetaData 
/standort/Standorte/standort-de/Werk-Leipzig 
/standort/Standorte/standort-de/Werk-Leipzig/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-München 
/standort/Standorte/standort-de/Geschäftsstelle-München/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-Stuttgart 
/standort/Standorte/standort-de/Geschäftsstelle-Stuttgart/MetaData 
/standort/Standorte/standort-de/Gelsdorf-(Mischwerk) 
/standort/Standorte/standort-de/Gelsdorf-(Mischwerk)/MetaData 
/standort/Standorte/standort-de/Gelsdorf-(Handläufe) 
/standort/Standorte/standort-de/Gelsdorf-(Handläufe)/MetaData 
/standort/Standorte/standort-de/KB-Roller-Tech-Kopierwalzen-GmbH 
/standort/Standorte/standort-de/KB-Roller-Tech-Kopierwalzen-GmbH/MetaData 
/standort/Standorte/standort-en 
/standort/Standorte/standort-en/MetaData 
/standort/Standorte/standort-en/Böttcher-UK-Ltd- 
/standort/Standorte/standort-en/Böttcher-UK-Ltd-/MetaData 

Mais je veux que les nœuds:

/standort/Standorte/standort-de/Teststandort 
/standort/Standorte/standort-de/Hauptwerk-Köln 
/standort/Standorte/standort-de/Geschäftsstelle-Berlin 
/standort/Standorte/standort-de/Geschäftsstelle-Frankfurt 
/standort/Standorte/standort-de/Geschäftsstelle-Hamburg 
/standort/Standorte/standort-de/Geschäftsstelle-Hannover 
/standort/Standorte/standort-de/Geschäftsstelle-Köln 
/standort/Standorte/standort-de/Werk-Leipzig 
/standort/Standorte/standort-de/Geschäftsstelle-München 
/standort/Standorte/standort-de/Geschäftsstelle-Stuttgart 
/standort/Standorte/standort-de/Gelsdorf-(Mischwerk) 
/standort/Standorte/standort-de/Gelsdorf-(Handläufe) 
/standort/Standorte/standort-de/KB-Roller-Tech-Kopierwalzen-GmbH 
/standort/Standorte/standort-en/Böttcher-UK-Ltd- 

donc sans les nœuds MetaData et les parents-nœuds . J'ai besoin de tout sous Standorte. Les enfants de Standorte peuvent être de type standort-de ou standort-en. J'espère que je pourrais rendre mon problème plus clair. J'ai raccourci ma sortie dans la dernière version de ma question. Jusqu'à présent, je n'ai trouvé aucune expression xpath qui pourrait m'aider. Mais cela est dû à mon manque de connaissances xpath.

Merci d'avance!

+0

Étrange résultat! Il devrait également sélectionner '/ standort/Standorte'. Si vous travaillez avec un PSVI, pourquoi ne pas faire correspondre l'annotation de type 'Teststandort'? –

+0

@Alejandro: hm, je ne sais pas. peut-être xpath cela fonctionne différemment lors de la sélection des nœuds dans jackrabbit. – meltac

+0

Ensuite, l'élément 'Standorte' a l'annotation de type' standort' et le résultat informe le chemin absolu complet des nœuds sélectionnés. –

Répondre

2

L'expression

//element(*, standort)//* 

sélectionne un élément (définitif *) qui est un descendant (deuxième //) d'un élément nulle part dans le document (//element()) qui a été validée avec succès contre une définition de type défini schéma pour standort. (Merci à @Alej pour aider correcte cette déclaration et ce qui suit.)

Donc, fondamentalement, vous sélectionnez chaque élément qui est un descendant d'un élément standort validé, supposant que vous avez un schéma attaché avec succès ..

Essayez l'expression XPath (mise à jour):

/standort/Standorte/(standort-de | standort-en)/* 
+0

@LarsH: Ceci est XPath 2.0 et le second argument pour le test de noeud 'element()' correspond à l'annotation de type. –

+0

J'espère que ma question révisée est mieux comprise. Naturellement, je ne parlais pas du nœud '/' mais des parents des feuilles – meltac

+0

@meltac, avez-vous essayé l'expression XPath '/ standort/Standorte/(standort-de | standort-en)/*', et quel était le résultat? – LarsH

2

utilisation:

(//element(*, standort)//*)[not(ancestor-or-self::MetaData)] 
+0

@Dimitre: Merci, cette requête semble aussi très explicite, mais xpath renvoie l'erreur suivante: null pour l'instruction: pour $ v in (// element (*, standort) // *) [pas (ancestor-or-self :: MetaData)] return $ v: null – meltac

+0

@meltac: Il n'y a pas de '$ v' dans ma réponse. Je garantis seulement que ma réponse est correcte - tout ce qui est au-delà peut être correct ou non. En outre, il semble que vous avez une faute de frappe dans votre expression - un '*' est manquant dans plus d'un endroit. Si vous n'obtenez aucun noeud sélectionné, mais que vous obtenez réellement les noeuds sélectionnés dans votre question, alors votre moteur XPath est cassé. J'ai fait deux choses: 1. Pris ton expression et l'entoure de parenthèses. Cela devrait sélectionner les mêmes nœuds. 2. Un prédicat ajouté qui filtre tout noeud qui est 'MetaData' ou a un ancêtre' Metadata'. Cela * devrait * fonctionner. –

+0

@Dimitre - Je pense que les caractères '*' manquants dans son commentaire ont été analysés comme du balisage en italique. – LarsH