Как вернуть набор узлов с шаблоном

Я пытаюсь преобразовать строку даты и времени в дату и время на основе узла в XSLT 1.0. в основном я хочу перейти от

31-12-2014

чтобы:

<Date>
    <Day>31</Day
    <Month>12</Month>
    <Year>2014</Year>
</Date>

Для достижения этого я создал этот шаблон:

<xsl:template name="ToDTNodes">
  <xsl:param name="dateTimeString"/>

  <xsl:variable name="date" select="substring($dateTimeString,1,10)"/>
  <xsl:variable name="result">
    <DtNode>
      <Year>
        <xsl:value-of select="substring($date,7,4)"/>
      </Year>
      <Month>
        <xsl:value-of select="substring($date,4,2)"/>
      </Month>
      <Day>
        <xsl:value-of select="substring($date,1,2)"/>
      </Day>
    </DtNode>
  </xsl:variable>

  <xsl:copy-of select="msxsl:node-set($result)/DtNode"/>
</xsl:template>

Я пытаюсь заставить шаблон возвращать узел / набор вместо фрагмента. Обратите внимание, что я тоже пробовал это без /DtNode в конце. Это позволило бы мне вызвать этот шаблон без использования функции набора узлов с каждым вызовом.

К сожалению, я получаю исключение при попытке доступа к ребенку:

XslTransformException: To use a result tree fragment in a path expression, first convert it to a node-set using the msxsl:node-set() function

когда я пытаюсь сделать это:

<xsl:variable name="result">
  <xsl:call-template  name="ToDTNodes">
    <xsl:with-param name="dateTimeString" select="$SomeNode/BeginDate" />
  </xsl:call-template>
</xsl:variable>

<Value>
  <xsl:value-of select="$result/Year"/>
</Value>

Есть ли какой-нибудь способ получить шаблон для возврата набора узлов вместо строки или искажения дерева результатов?

1 ответ

Решение

Нет, в XSLT 1.0 вам потребуется использовать элемент расширения, например http://exslt.org/func/elements/result/index.html в http://exslt.org/func/elements/function/index.html чтобы иметь возможность возвращать набор узлов, а не фрагмент дерева результатов. Шаблон всегда будет возвращать фрагмент дерева результатов.

Другие вопросы по тегам