Question

Je développe une application qui accepte les expressions XPath définies par l'utilisateur et les utilise dans le cadre de son fonctionnement d'exécution.

Cependant, je voudrais pouvoir déduire des données supplémentaires en manipulant programmaticalement l'expression, et je suis curieux de savoir s'il existe des situations dans lesquelles cette approche pourrait échouer.

Compte tenu de toute expression XPath définie par l'utilisateur qui renvoie un ensemble de nœuds, est-il sûr de l'envelopper dans le XPATH count() Fonction Pour déterminer le nombre de nœuds dans l'ensemble:

count(user_defined_expression)

De même, est-il sûr d'ajouter un indice de tableau à l'expression pour extraire l'un des nœuds de l'ensemble:

user_defined_expression[1]
Était-ce utile?

La solution

Eh bien, une expression XPath (dans XPath 1.0) peut produire un ensemble de nœuds ou une chaîne ou un nombre ou un booléen et faire le nombre (expression) n'a de sens que sur toute expression donnant un ensemble de nœuds.

Quant à l'ajout d'un prédicat positionnel, je pense que vous voudrez peut-être utiliser des parenthèses autour de votre expression, c'est-à-dire pour changer /root/foo/bar dans (/root/foo/bar)[1] comme vous sélectionnez le premier bar élément de l'ensemble de nœuds sélectionné par /root/foo/bar tandis que sans eux tu obtiendrais /root/foo/bar[1] qui sélectionnerait le premier bar élément enfant de tout foo élément enfant du root élément.

Autres conseils

Vérifiez-vous que de telles expressions définies par l'utilisateur évaluent toujours en ensemble de nœuds?

Si oui, le premier EXPR est OK. Le type de données sera correct pour fn:count

Le deuxième est beaucoup plus délicat, avec beaucoup de situations, il y aura un axe de surpoids, par exemple. Vérifiez cette réponse pour une analyse simple. Il sera difficile de dire ce que signifiait vraiment un utilisateur.

Une approche plus robuste consisterait à convertir l'expression XPATH en xQueryx, qui est une représentation XML de l'arbre de syntaxe abstrait; Vous pouvez ensuite effectuer des transformations XQuery ou XSLT sur cette représentation XML, puis reproduire en un XPATH (ou XQuery) modifié pour l'évaluation.

Cependant, cela ne vous donnera toujours que la structure syntaxique de l'expression; Si vous voulez des informations sémantiques, comme le type statique inféré du résultat, vous devrez probablement piquer dans un processus XPath qui expose ces informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top