2017-08-14 1 views
0

J'essaie de sélectionner un dossier et ses descendants à partir d'un JCR avec XPath. Je peux sélectionner le dossier assez facilement:Sélectionnez l'élément et ses descendants

//content/documents/folder-name 

Je peux choisir ses descendants aussi:

//content/documents/folder-name//* 

Cependant, je ne peux pas comprendre comment obtenir les deux. J'ai essayé plusieurs choses. Ceux-ci ne sélectionnez:

//content/documents/folder-name | //content/documents/folder-name//* 
//content/documents/folder-name(. | *) 
//content/documents/folder-name/(. | *) 
//content/documents/folder-name/descendant-or-self 
//content/documents/folder-name/descendant-or-self::node() 

Ces deux lancer une javax.jcr.query.InvalidQueryException:

//content/documents/folder-name[. | *] 
//content/documents/folder-name/[. | *] 

Évidemment, je suis terrible à XPath. S'il vous plaît aider. Editer: J'utilisais le préfixe // parce que je ne savais pas que je pouvais utiliser /jcr:root/content à la place. J'ai le même problème avec ça, cependant.

Répondre

0

Vous pouvez combiner deux XPath en utilisant l'opérateur syndical:

xpath1 | xpath2 

Cependant, votre première XPath,

//content/documents/folder-name 

ne sélectionne l'élément folder-name (s), qui comprend les descendants de l'élément .

Si vous voulez que les folder-name éléments pour être le premier dans une liste, suivis de leurs descendants, vous pouvez combiner comme suit:

//content/documents/folder-name | //content/documents/folder-name//* 
+0

'/ jcr: root/content/documents/nom-du-dossier |/jcr: root/content/documents/nom-du-dossier/* 'ne sélectionne rien. De même pour '// content/documents/nom-de-dossier | // content/documents/nom-du-dossier // * '. '// content/documents/folder-name' n'inclut pas les descendants. –

+1

Peut-être que vous feriez mieux de poster un exemple de XML et les résultats exacts que vous attendez pour que nous sachions ce que vous essayez de faire. Les XPaths dans votre commentaire incluent maintenant des préfixes d'espace de noms, et c'est une autre source possible de problèmes potentiels que nous ne pouvons pas diagnostiquer sans voir votre XML. – kjhughes

+0

Je voudrais, mais c'est un énorme fichier avec des choses NDA en elle. Je vais essayer d'obtenir quelque chose de proche quand j'ai quelques minutes. –

0

//content/documents/folder-name/descendant-or-self::node() me semble correct (sans voir votre entrée XML), bien que //content/documents/folder-name/descendant-or-self::* est probablement mieux. Certainement si //content/documents/folder-name sélectionne quelque chose, alors // `content/documents/nom-dossier/descendant-or-self :: *` devrait également sélectionner quelque chose.

Dans XPath 2.0, vous pouvez faire //content/documents/folder-name/(.|descendant::*) mais bien que ce soit plus court, il me semble plus maladroit que d'utiliser l'axe descendant ou self.