Ответ на другой поток (см. stackoverflow: generate css color schemes) Я столкнулся с проблемой ниже, где разные двигатели xsl, похоже, нуждаются в разных подходах при преобразовании фрагментов дерева результатов в узловые множества.фрагмент дерева результатов для набора узлов: общий подход для всех движков xsl
Упрощение проблемы (но см. Ссылку выше для полной истории), я хочу иметь встроенное дерево, содержащее список значений цвета. Поскольку это должно использоваться в выражениях Xpath, мне пришлось создать набор узлов из него специально для MSXML x.x xsl engine (встроенный XML-шпион имел меньше проблем с интерпретацией выражений Xpath, связанных с переменными, построенными как rtf's).
Еще одна тема stackoverflow: automating-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'
Просто для будущих читателей, работает в «XML-22036 (ошибка) не удается преобразовать результат фрагмент дерева в NodeSet "в Oracle 11g R1 BPEL XSLT 1.0 Transform: это может быть вызвано ошибкой. По-видимому, имя параметра в XSLT должно соответствовать параметру, который передается при его вызове, включая идентификацию «части». Итак, если какой-либо ответ зафиксирован в 'body' части переменной message-type' response', то для использования этого в последующем преобразовании параметр в XSLT также должен быть назван 'response.body'. Затем его можно просто называть «$ response.body/some/xpath». – Arjan