Может ли функция XSLT 2.0 возвращать произвольные типы? - PullRequest
4 голосов
/ 11 мая 2011

Я пытаюсь написать функцию 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>

Спасибо Майклу и Джиму за то, что они уловили мою первоначальную оплошность ...

1 Ответ

3 голосов
/ 11 мая 2011

Я считаю, что проблема в том, что вы должны удалить финальный <xsl:value-of...>. value-of создает текстовый узел, а это не то, что вам нужно. Конструктор последовательности уже содержит узлы, которые вы хотите вывести.

...