En réponse à un autre fil de discussion (voir stackoverflow : générer des schémas de couleurs css ) Je suis tombé sur le problème ci-dessous, où différents moteurs xsl semblent avoir besoin de différentes approches pour transformer les fragments de l'arbre de résultats en ensembles de nœuds.
En simplifiant le problème (mais voir le lien ci-dessus pour l'histoire complète), je souhaite avoir un arbre en ligne contenant une liste de valeurs de couleur. Comme cela doit être utilisé dans des expressions Xpath, j'ai dû créer un ensemble de noeuds spécifiquement pour le moteur xsl de MSXML x.x (XML Spy intégré avait moins de difficultés à interpréter les expressions Xpath contenant des variables construites comme des rtf).
Un autre fil de discussion stackoverflow : automatisation de l'ensemble des nœuds d'extrusion (Exsltnode-set) m'a aidé. L'ensemble de nœuds résultant est utilisé pour créer une nouvelle variable rtf à partir du XML d'entrée.
Là encore, MSXML se plaint lorsque la nouvelle variable est utilisée dans des expressions Xpath, j'ai donc utilisé la fonction node-set pour créer un node-set à partir de cette variable.
Jusqu'à présent, tout va bien, et MSXML x.x ne provoque plus d'erreur.
Mais lorsque j'exécute la même opération avec XML Spy built-in ou Saxon 9he, j'obtiens une autre erreur : il semble que la fonction node-set soit inconnue :
Cannot find a matching 1-argument function named {urn:schemas-microsoft-com:xslt}node-set() in variable colorList
Notez que cette approche en deux étapes n'est pas nécessaire dans cet exemple particulier, mais comme je l'ai dit, j'ai simplifié les choses ; je souhaite simplement savoir comment écrire une transformation XSLT 1.0 qui fonctionnera dans tous les moteurs xsl.
Le XSLT que j'ai utilisé :
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:std="http://whatever"
xmlns:exslt="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="std exslt">
<xsl:output method="xml" indent="yes"/>
<std:colors>
<color>#0000FF</color>
<color>#FF0000</color>
</std:colors>
<xsl:variable name="colors" select="document('')/*/std:colors"/>
<xsl:variable name="std:colorList">
<xsl:for-each select="//testid">
<xsl:variable name="pos" select="position() mod 2"/>
<xsl:element name="color">
<xsl:attribute name="testid"><xsl:value-of select="."/></xsl:attribute>
<xsl:value-of select="$colors/color[$pos + 1]"/>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="colorList" select="exslt:node-set($std:colorList)"/>
<xsl:template match="/">
<output>
<xsl:copy-of select="$colorList/color"/>
</output>
</xsl:template>
</xsl:stylesheet>
Fichier d'entrée :
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<defects>
<testid>111</testid>
</defects>
<defects>
<testid>999</testid>
</defects>
</NewDataSet>
Résultat en MSXML 3.0/4.0/6.0 :
<?xml version="1.0" encoding="UTF-16"?>
<output>
<color testid="111">#FF0000</color>
<color testid="999">#0000FF</color>
</output>
Résultat en Saxon9he :
Cannot find a matching 1-argument function named {urn:schemas-microsoft-com:xslt}node-set()
in variable colorList
résultat en XML Spy built-in xsl engine :
Error in XPath expression
Unknown function - Name and number of arguments do not match any function signature in the static context - 'urn:schemas-microsoft-com:xslt:node-set'