XSLT : Création d'une Carte en XSLT
Je veux avoir une valeur de la clé de carte à xsl et donc défini une variable qui a un fragment xml, mais plus tard, quand j'essaie d'accéder aux nœuds xml dans la variable, j'obtiens une erreur que le type de l'expression xpath, xpression ne peut pas être résolu.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="map">
<map>
<entry key="key-1">value1</entry>
<entry key="key-2">value2</entry>
<entry key="key-3">value3</entry>
</map>
</xsl:variable>
<output>
<xsl:value-of select="$map/entry[@key='key-1']"/>
</output>
</xsl:template>
</xsl:stylesheet>
- Il y a un peu d'une faute de frappe se passe là-bas, qui est également dans votre document? C'est <xsl:vlaue-de>, qui devrait se lire <xsl:value-of>.
Vous devez vous connecter pour publier un commentaire.
XSLT 2.0
À l'aide de XSLT 2.0, la solution suivante fonctionne:
XSLT 1.0
Vous ne pouvez pas utiliser un résultat fragment d'arbre dans une expression XPath XSLT 1.0, mais
fn:document()
pouvez récupérer les valeurs de la carte. Une réponse à un question similaire va travailler ici:.Comme décrit dans la XSLT 1.0 de la spécification:
Cependant, vous n'avez pas besoin d'utiliser
xsl:variable
pour cela. Vous pouvez spécifier votre carte nœud directement sousxsl:stylesheet
, mais vous devez vous rappeler que l'un des éléments de niveau supérieur doit avoir un non-nulle de l'espace de noms URI:copy-of
/value-of
sur la variable$map
sans essayer de l'utiliser comme un ensemble de nœuds, il va fonctionner. Mais une fois que vous essayer de faire votre chemin vers le bas le résultat fragment d'arbre avec une expression XPath, il échouera.<xsl:value-of select="$map/entry[@key = $param]"/>
ou...[@key = xpath/of/@choice]
.Vous pouvez sorte de travail autour de XSLT 1.0 manque de soutien pour l'utilisation de la variable comme un ensemble de nœuds. Vous devrez compter sur les extensions ajoutés par le fabricant de l'analyseur. Par exemple, Microsoft a offert une fonction pour contourner ce: node-set()
Votre XSL ressemblera à ceci:
Avis de l'espace de noms et le msxsl-préfixe ici. Cela ne fonctionnera que dans les applications basées sur Microsoft de l'analyseur (par exemple: Internet Explorer utilise, ainsi que .NET).
D'autres analyseurs peuvent ou peuvent ne pas avoir une telle extension (Saxxon le fait, par exemple, mais il est nommé un peu différemment). Mais, il élimine en fonction XSLT 2.0, comme ce sera beau travail en XSLT 1.0 et Microsoft n'a pas encore de support XSLT 2.0 dans leur bibliothèque XML (à moins qu'ils ai ajouté récemment).
En fonction de l'analyseur vous utilisez, le ci-dessus peut bien fonctionner pour vous, sinon Par T la réponse est le mieux pour vous.
xxx:node-set()
extension, mais le problème actuel n'est pas un de ces. Aussi, en défendant unxxx:node-set()
solution on doit toujours se référer à laexslt:node-set()
, ce qui est tout à fait portable parce que de nombreux fournisseurs offrent des EXSLT implémentations.Dans XSLT 3.0 de Travail Projet de, un nouveau type de XPath de l'élément (map) est proposée, voir cartes en XSLT 3.0 WD Spec.
Donc, si votre processeur XSLT 3.0 et prend en charge les cartes (par exemple Saxon 9.4), vous pouvez utiliser le code suivant: