2008-10-09 10 views
2

Je n'arrive pas à sélectionner les éléments qui font partie d'un espace de noms spécifique. Mon expression XPath fonctionne dans XMLSpy mais échoue lorsque vous utilisez les bibliothèques Xalan ..comment sélectionner un élément dans un espace de noms spécifique?

<item> 
    <media:content attrb="xyz"> 
    <dcterms:valid>VALUE</dcterms:valid> 
    </media:content> 
</item> 

Mon expression est ./item/media:content/dcterms:valid. J'ai déjà ajouté les deux définitions d'espace de noms à mon XSLT. Encore une fois, cela sélectionne les bonnes valeurs dans XMLSpy mais échoue lors de l'exécution de la bibliothèque Xalan.

Des idées?

Répondre

0

Avez-vous essayé de définir l'espace de noms de blob XML?

<item xmlns:dcterms="http://dcterms.example" xmlns:media="http://media.example"> 
    <media:content attrb="xyz"> 
    <dcterms:valid>VALUE</dcterms:valid> 
    </media:content> 
</item> 

-à-dire

  • xmlns: dcterms = "http: //dcterms.example"
  • xmlns: media = "http: //media.example"
+0

Il est déjà dans le code source XML. – TChen

-1

Peut-être XMLSpy a implémenté la spécification XSLT 2.x dont je pense que XPath fait partie. Xalan d'autre part est toujours 1.x.

+0

Il existe une spécification XPath 1.0 et XPath 2.0, qui correspondent (fondamentalement) aux versions de XSLT 1.0 et XSLT 2.0. Le XPath qu'il tente est valide XPath 1.0. –

0

Dans quel contexte vous essayez d'évaluer votre XPath à partir? (Par exemple, un XSLT?) Si est l'élément racine, vous pouvez essayer de supprimer le ".": "/ Item/media: content/dcterms: valide." S'il y a une série d'éléments, vous pouvez essayer d'ajouter une autre barre oblique au début: "// item/media: content/dcterms: valid." Cela sélectionnera tous les éléments du document correspondant à ces critères, quel que soit l'emplacement de la structure du document.

0

Les préfixes dans XML sont sans signification jusqu'à ce qu'ils soient liés à un certain espace de noms, et cela est également vrai pour les expressions XPath - il ne correspondra pas simplement parce que vous avez utilisé le même préfixe.

Vous devez créer votre propre classe PrefixResolver qui donnera des URI d'espace de noms complets pour les préfixes que vous avez dans votre expression XPath.

1

Vous devez implémenter un org.apache.xml.utils.PrefixResolver pour mapper le préfixe à l'URI de l'espace de noms, puis passer une instance à l'instance XPath que vous utilisez. Cela vous permettra d'utiliser différents préfixes dans vos expressions XPath à partir de ceux de vos documents (que vous ne pouvez pas contrôler). Par exemple, vous pouvez créer une implémentation qui utilise une paire de mappes (une pour mapper du préfixe -> espace de noms URI et une de l'URI au préfixe).

Dans JAXP, l'interface équivalente à implémenter est javax.xml.namespace.NamespaceContext.

0

Vous pouvez essayer un XPath sélectionner le nom local et (le cas échéant) donner un espace de nom URI. Et par exemple:

/*[local-name()='NewHireList' and namespace-uri()='http://BRE.NewHireList']/*[local-name()='Record' and namespace-uri()=''] 

Voir this page pour plus ou Google sur son nom local et XPath.

Questions connexes