resultar fragmento de árbol a conjunto de nodos: enfoque genérico para todos los motores xsl
Responder otro hilo (verstackoverflow: generar esquemas de color css) Me encontré con el siguiente problema, donde diferentes motores xsl parecen necesitar diferentes enfoques para transformar los fragmentos del árbol de resultados en conjuntos de nodos.
Simplificando el problema (pero vea el enlace de arriba para la historia completa detrás de esto), deseo tener un árbol en línea que contenga una lista de valores de color. Como esto tiene que usarse en expresiones Xpath, tuve que crear un conjunto de nodos a partir de él específicamente para el motor MSXML x.x xsl (XML Spy incorporado tuvo menos problemas para interpretar las expresiones Xpath que contienen variables construidas como rtf).
Sin embargo, otro hilostackoverflow: automatating-exsltnode-set me ayudó allí. El conjunto de nodos resultante se utiliza para crear una nueva variable rtf a partir del XML de entrada.
De nuevo, MSXML se queja cuando se usa la nueva variable en las expresiones Xpath, así que utilicé la función de conjunto de nodos para crear un conjunto de nodos a partir de ella.
Hasta ahora todo bien, y MSXML x.x ya no da error.
Pero cuando ejecuto lo mismo en XML Spy incorporado o Saxon 9he, obtengo otro error: parece que la función de conjunto de nodos es desconocida:
Cannot find a matching 1-argument function named {urn:schemas-microsoft-com:xslt}node-set() in variable colorList
Observe que este enfoque de dos pasos no es necesario en este ejemplo en particular, pero como dije simplifiqué las cosas; Solo deseo saber cómo escribir una transformación XSLT 1.0 que funcione en todos los motores xsl.
El XSLT que utilicé:
<?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>
Fichero de entrada
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<defects>
<testid>111</testid>
</defects>
<defects>
<testid>999</testid>
</defects>
</NewDataSet>
Result 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>
Resultado en Saxon9he:
Cannot find a matching 1-argument function named {urn:schemas-microsoft-com:xslt}node-set()
in variable colorList
result en XML Spy incorporado en el motor xsl:
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'