7
votes

Comment puis-je obtenir une valeur d'une paire de clé / valeur XML avec XPath dans mon XSLT?

J'ai du XML que je veux traiter avec XSLT. Une bonne quantité de données passe dans des paires de valeur clé (voir ci-dessous). Je me débats avec comment extraire la base de valeur sur la clé en une variable. J'aimerais pouvoir faire quelque chose comme ceci: xxx pré>

mais cela ne semble pas fonctionner. Voici un échantillon XML. P>

<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
  <entry>
    <key>
      foo
    </key>
    <value>
      bar
    </value>
  </entry>
</root>


1 commentaires

Bonne question (+1). Saviez-vous que la réponse que vous avez sélectionnée n'est pas généralement correcte? Voir ma réponse pour une explication et pour deux vraies solutions. :)


3 Réponses :


5
votes

Votre XPath fonctionne bien pour le document suivant (équivalent): xxx

Vous pouvez utiliser la fonction XPath contient pour obtenir le même résultat sans restructurer votre XML: xxx


2 commentaires

J'aurais dû savoir que cela aurait été quelque chose comme ça. Malheureusement, expliquer le changement de XML aux personnes créant le XML serait trop difficile. Je vais utiliser le XPath. Merci beaucoup.


Solution très simple, mais si dans votre XML était "FOOZ", il contient toujours "FOO" et vous aurez un mauvais match.



6
votes

La transformation suivante montre deux façons d'atteindre ce - avec et sans l'utilisation de et la touche () Fonction: xxx

Notez l'utilisation de la normalisation-espace () fonction pour dépouiller les caractères de l'espacement de premier plan ou de fuite du Valeur de .


3 commentaires

Semble être le meilleur des deux mondes, correct?


@Tahoewolverine: en pure xpath One a d'utiliser cette expression. Chaque fois que XPath est hébergé par XSLT, je préfère toujours utiliser des clés - N'est-ce pas notable comment la clé-expression est plus simple que la "pure" xpath? Un autre argument très fort en faveur des clés est que, dans la plupart des cas, l'utilisation de clés est de nombreux facteurs de grandeur plus rapidement.


Oui, je vois ça maintenant. J'étais un peu confus parce que je n'ai pas vu où vous définissez des variables. Une fois que j'ai commencé à créer les variables de cette façon, les choses sont devenues un peu plus propre. Merci.



3
votes
<xsl:variable name="foo" select="/root/entry[key='foo']/value" />
This is an exact match so make sure there are no spare spaces or new line characters around foo in your XML. Otherwise use replace function and a regular expression to trim them.

0 commentaires