Я пытаюсь написать функцию XSLT 2.0, которая возвращает результат определенного типа - скажем, один или несколько элементов.Вот что я попробовал, но безрезультатно:
<xsl:function name="util:find-parents2" as="element(parent)*">
<xsl:variable name="output" as="element(parent)*">
<xsl:for-each select="('one','two')">
<parent>
<xsl:sequence select="."/>
</parent>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$output"/>
</xsl:function>
Вот ошибка, которую я получаю от саксонского процессора:
Error at xsl:function on line 192 column 65 of file:/e:/mlsh/recursive.xsl:
XTTE0780: Required item type of result of function util:find-parents2() is element(parent,
xs:anyType); supplied value has item type text() Failed to compile stylesheet. 1 error detected.
Но я ожидал получить что-то вроде этого:*
<parent>one</parent>
<parent>two</parent>
Что мне здесь не хватает?Я думал, что указал соответствующий тип для $ output (один или несколько элементов <parent>
), но процессор явно не получает сообщение и видит только текст.Как я могу вернуть список <parent>
элементов здесь?Заранее спасибо ...
ОБНОВЛЕНИЕ:
Подводя итог, можно ответить на вопрос в названии "да".Ключ в исходном примере - это разница между <xsl:value-of>
и <xsl:sequence>
.Замена первого последним является одним из способов получить желаемое поведение.Другим способом было бы «развернуть» содержимое элемента <xsl:variable>
, что несколько усложняет ситуацию:
<xsl:function name="util:find-parents2" as="element(parent)*">
<xsl:for-each select="('one','two')">
<parent>
<xsl:sequence select="."/>
</parent>
</xsl:for-each>
</xsl:function>
Спасибо Майклу и Джиму за то, что они уловили мою первоначальную оплошность ...