Как запрограммировать запасной вариант для функций, еще не доступных в XSLT?

Как сделать функцию unparsed-text-lines() эффективной доступной для процессоров XSLT 2.0 и XSLT 3.0 в одной таблице стилей?

Я думал, что могу использовать функцию function-available() вот так, но это возвращает синтаксическую ошибку для процессора XSLT 2.0.

<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:fn="http://www.w3.org/2005/xpath-functions" 
  xmlns:local="local" 
  version="2.0" exclude-result-prefixes="xs fn local">

<xsl:function name="local:unparsed-text-lines" as="xs:string+">
 <xsl:param name="href" as="xs:string" />
 <xsl:choose>
  <xsl:when test="function-available('fn:unparsed-text-lines')">
   <!-- XSLT 3.0 -->
   <xsl:sequence select="fn:unparsed-text-lines($href)" />
  </xsl:when>
  <xsl:otherwise>
   <!-- XSLT 2.0 -->
   <xsl:sequence select="fn:tokenize(fn:unparsed-text($href), '\r\n|\r|\n')[not(position()=last() and .='')]" />
  </xsl:otherwise>
 </xsl:choose>
</xsl:function>

etc.

person Sean B. Durkin    schedule 20.02.2012    source источник


Ответы (1)


Проблема в следующем:

<xsl:when>

является оператором времени выполнения, и компилятор не знает во время компиляции, что его результатом будет true() или false().

Решение. Используйте атрибут use-when.

Преобразование становится примерно таким:

<xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:local="local"
      version="2.0" exclude-result-prefixes="xs local">

    <xsl:function name="local:unparsed-text-lines" as="xs:string+">
     <xsl:param name="href" as="xs:string" />
       <xsl:sequence select="fn:unparsed-text-lines($href)"
             use-when="function-available('unparsed-text-lines')" />
       <xsl:sequence use-when="not(function-available('unparsed-text-lines'))"
        select="tokenize(unparsed-text($href), '\r\n|\r|\n')
                    [not(position()=last()
                        and
                          .=''
                        )
                    ]" />
    </xsl:function>
</xsl:stylesheet>

и теперь ошибка не возникает.

person Dimitre Novatchev    schedule 20.02.2012
comment
Спасибо. Сначала я пробовал xsl:use-when на уровне xsl:when, но компиляция все равно не удалась. Спасибо. - person Sean B. Durkin; 20.02.2012