ragmento da árvore @result para o conjunto de nós: abordagem genérica para todos os mecanismos x

Respondendo a outro tópico (consultestackoverflow: gerar esquemas de cores css) Eu me deparei com o problema abaixo, onde diferentes mecanismos xsl parecem precisar de abordagens diferentes para transformar fragmentos de árvore de resultados em conjuntos de nó

Simplificando a questão (mas veja o link acima para a história completa por trás disso), desejo ter uma árvore em linha contendo uma lista de valores de cores. Como isso deve ser usado nas expressões Xpath, tive que criar um conjunto de nós especificamente para o mecanismo MSXML x.x xsl (o XML Spy interno teve menos problemas para interpretar expressões Xpath que continham variáveis construídas como rtf's
Ainda outra discussãostackoverflow: automating-exsltnode-set me ajudou lá. O conjunto de nós resultante é usado na criação de uma nova variável rtf a partir do XML de entrad
Novamente, o MSXML reclama quando a nova variável é usada nas expressões Xpath, então usei a função de conjunto de nós para criar um conjunto de nós a partir del
Até agora tudo bem, e o MSXML x.x não se engana mai
Mas, quando executo o mesmo no XML Spy interno ou no Saxon 9he, recebo outro erro: parece que a função do conjunto de nós é desconhecida:

Cannot find a matching 1-argument function named {urn:schemas-microsoft-com:xslt}node-set() in variable colorList

Observe que essa abordagem em duas etapas não é necessária neste exemplo em particular, mas como eu disse, simplifiquei as coisas; Eu só quero saber como escrever uma transformação XSLT 1.0 que funcione em todos os mecanismos xs

O XSLT que eu usei:

<?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>

Arquivo de entrada

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <defects>
    <testid>111</testid>
  </defects>
  <defects>
    <testid>999</testid>
  </defects>
</NewDataSet>

Resultado no 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 em Saxon9he:

Cannot find a matching 1-argument function named {urn:schemas-microsoft-com:xslt}node-set()
in variable colorList

result no mecanismo xsl interno do XML Spy:

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'

questionAnswers(10)

yourAnswerToTheQuestion