фрагмент дерева результатов для набора узлов: общий подход для всех движков xsl

Отвечая на другую тему (см.stackoverflow: генерировать цветовые схемы CSSЯ столкнулся с проблемой ниже, где разные движки xsl, похоже, нуждаются в разных подходах при преобразовании фрагментов дерева результатов в наборы узлов.

Упрощая проблему (но см. Ссылку выше для полной истории этого), я хотел бы иметь встроенное дерево, содержащее список значений цвета. Поскольку это должно использоваться в выражениях Xpath, мне пришлось создать из него набор узлов специально для движка MSXML x.x xsl (встроенному XML Spy было меньше проблем с интерпретацией переменных выражения Xpath, создаваемых как rtf).
Еще одна темаstackoverflow: автоматизация-exsltnode-set помог мне там. Результирующий набор узлов используется при создании новой переменной rtf из входного XML.
И снова MSXML жалуется, когда новая переменная используется в выражениях Xpath, поэтому я использовал функцию набора узлов, чтобы создать из нее набор узлов.
Пока все хорошо, и MSXML x.x больше не дает ошибок.
Но когда я запускаю то же самое во встроенном XML Spy или в Saxon 9he, я получаю еще одну ошибку: кажется, что функция набора узлов неизвестна:

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

Обратите внимание, что этот двухэтапный подход не нужен в данном конкретном примере, но, как я уже сказал, я упростил вещи; Я просто хочу знать, как написать преобразование XSLT 1.0, которое будет работать во всех движках xsl.

XSLT я использовал:

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

Входной файл:

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

Результат в 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>

Результат в Saxon9he:

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

результат в XML Spy встроенный движок 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'

Ответы на вопрос(5)

Ваш ответ на вопрос