как написать функцию в xslt1.0 после перехода с xslt 2.0

У меня был xslt2.0, который я понизил до 1.0 и использовал xalan, но получаю следующее исключение.

Исправимая ошибка: строка 9: неподдерживаемая функция элемента XSL.

часть xslt, как показано ниже.

    <xsl:function name="nav:adjustDate">
            <xsl:param name="dateStr" />
            <xsl:param name="age" />
            <xsl:variable name="minutes">
                    <xsl:choose>
                            <xsl:when test="$age = 1">
                                    <xsl:value-of select="0" />
                            </xsl:when>
                            <xsl:when test="$age = 2">
                                    <xsl:value-of select="-10" />
                            </xsl:when>
                            <xsl:when test="$age = 3">
                                    <xsl:value-of select="-20" />
                            </xsl:when>
                            <xsl:when test="$age = 4">
                                    <xsl:value-of select="-30" />
                            </xsl:when>
                            <xsl:when test="$age = 5">
                                    <xsl:value-of select="-40" />
                            </xsl:when>
                            <xsl:when test="$age = 6">
                                    <xsl:value-of select="-50" />
                            </xsl:when>
                            <xsl:otherwise>
                                    <xsl:value-of select="-60" />
                            </xsl:otherwise>
                    </xsl:choose>
            </xsl:variable>
            <xsl:variable name="dateFormatterStr">
                    <xsl:text>yyyy-MM-dd'T'HH:mm:ss.SSSZ</xsl:text>
            </xsl:variable>
            <!--  output date format should match the input date format of the job file -->
            <xsl:variable name="outDateFormatterStr">
                    <xsl:text>yyyy-MM-dd'T'HH:mm:ssZ</xsl:text>
            </xsl:variable>
    <xsl:variable name="bo" select="bool:new('FALSE')" />
            <xsl:variable name="dateFormatter" select="dateFormat:new($dateFormatterStr)" />
            <xsl:variable name="outDateFormatter" select="dateFormat:new($outDateFormatterStr)" />
    <xsl:value-of select="dateFormat:setLenient($dateFormatter,$bo)" />
            <!-- Have to remove the colon in the timezone offset(eg. +05:00) otherwise date formatter wont work correctly -->
            <xsl:variable name="testDate"
                    select="dateFormat:parse($dateFormatter,concat(substring($dateStr,1,string-length($dateStr)-3),'00'))" />
            <xsl:variable name="cal" select="gregorianCal:new()" />
            <xsl:value-of select="gregorianCal:setTime($cal,$testDate)" />
            <!-- xslt version 2 does not accept contants 12 represents the value for java.util.Calendar.MINUTE
                 Follow section of code will subtract the number of minutes-->
            <xsl:value-of select="gregorianCal:add($cal,12,$minutes)" />
            <xsl:variable name="outputDate" select="gregorianCal:getTime($cal)" />
            <xsl:sequence select="dateFormat:format($outDateFormatter,$outputDate)" />
    </xsl:function>

также хочу узнать замену xsl:sequence в xslt1.0

Может ли кто-нибудь помочь мне в этом? как продолжить ? я совершенно новый для xslt.


person Abhijeet    schedule 30.05.2013    source источник


Ответы (1)


Если вы новичок в XSLT, то обратное портирование таблицы стилей из XSLT 2.0 в XSLT 1.0 может оказаться очень болезненным. Удачи.

В XSLT 1.0 часто можно использовать именованные шаблоны там, где в XSLT 2.0 можно было бы использовать функцию. Вам нужно будет изменить внешнюю инструкцию xsl:function на xsl:template, а затем вам нужно будет изменить все вызывающие объекты, чтобы установить переменную, вызывая именованный шаблон вместо вызова функции. И, наконец, вам нужно будет перевести тело функции в XSLT 1.0. Судя по большому количеству переменных, инициализируемых вызовами других объявленных пользователем функций, это будет очень медленный процесс.

Если ваша цель (или цель тех, кто поставил перед вами эту задачу) — предоставить возможность для длительного и интенсивного построчного изучения таблицы стилей, то это, наверное, хороший способ. В противном случае, я бы на вашем месте предложил пересмотреть решение о переходе на 1.0.

person C. M. Sperberg-McQueen    schedule 30.05.2013