Question

un échantillon de document XML:

  <xml>
    <list>
      <item refid="1" />
      <item refid="3" />
    </list>
    <catalogue>
      <model id="1"><details /></model>
      <model id="2"><details /></model>
      <model id="3"><details /></model>
    </catalogue>
  </xml>

Je voudrais quelque chose comme requête // modèle [@id = (// item / @ refid)] pour obtenir tout « modèle » ayant un identifiant référencé dans « la liste »

Était-ce utile?

La solution

  

Je voudrais quelque chose comme requête   // modèle [@id = (// item / @ refid)] pour   obtenir tout « modèle » ayant Référencés   id dans "la liste"

Le principal problème ici est votre manque de confiance et le fonctionnement d'un moteur pas réellement XPath pour évaluer les expressions que vous êtes avec.

Si vous évaluez l'expression XPath vous proposiez:

//model[ @id = (//item/@refid) ]

Vous verrez qu'il sélectionne exactement les (deux) éléments model, dont les attributs id sont référencés par les refid attributs des éléments de item qui sont des enfants de list.

@ Jörn-Horstmann dans sa réponse déjà expliqué pourquoi vous obtenez ces résultats.

Une remarque mineure est d'éviter en général en utilisant l'abréviation // . Il provoque l'ensemble du document à numériser et est très inefficace. Dans ce cas, j'utiliser l'équivalent mais probablement plus rapide pour évaluer l'expression XPath:

/*/catalogue/model[@id = /*/list/item/@refid]

Autres conseils

Votre expression XPath doit revenir déjà exactement ce que vous voulez. Je cite http://www.w3.org/TR/xpath/#booleans, 5ème paragraphe:

  

Si un objet à comparer est un ensemble de nœuds et l'autre est une chaîne, la comparaison sera vrai si et seulement s'il y a un noeud dans l'ensemble de nœuds de telle sorte que le résultat d'effectuer la comparaison sur la -valeur de chaîne du nœud et l'autre chaîne est true

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