2010-04-28 2 views
1

Я использую date:format-date template EXSLT file Я использую XSLT 1.0 и MSXML3.0 в качестве процессора.Дата EXSLT: формат даты шаблон без документа() XSLT 1.0

Моя дата: декларация форматно-дата шаблонного EXSLT файла является:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:date="http://exslt.org/dates-and-times" 
    xmlns:str="http://exslt.org/strings" 
    extension-element-prefixes="msxsl date str"> 
    ... 
</xsl:stylesheet> 

Я не могу использовать документ (функцию) в связи с ограничениями 3-й партии. Так что я изменил месяцы и дни (аналогично) из XML сниппета:

<date:months> 
    <date:month length="31" abbr="Jan">January</date:month> 
    <date:month length="28" abbr="Feb">February</date:month> 
    <date:month length="31" abbr="Mar">March</date:month> 
    <date:month length="30" abbr="Apr">April</date:month> 
    <date:month length="31" abbr="May">May</date:month> 
    <date:month length="30" abbr="Jun">June</date:month> 
    <date:month length="31" abbr="Jul">July</date:month> 
    <date:month length="31" abbr="Aug">August</date:month> 
    <date:month length="30" abbr="Sep">September</date:month> 
    <date:month length="31" abbr="Oct">October</date:month> 
    <date:month length="30" abbr="Nov">November</date:month> 
    <date:month length="31" abbr="Dec">December</date:month> 
</date:months> 

переменной:

<xsl:variable name="months"> 
    <month length="31" abbr="Jan">January</month> 
    <month length="28" abbr="Feb">February</month> 
    <month length="31" abbr="Mar">March</month> 
    <month length="30" abbr="Apr">April</month> 
    <month length="31" abbr="May">May</month> 
    <month length="30" abbr="Jun">June</month> 
    <month length="31" abbr="Jul">July</month> 
    <month length="31" abbr="Aug">August</month> 
    <month length="30" abbr="Sep">September</month> 
    <month length="31" abbr="Oct">October</month> 
    <month length="30" abbr="Nov">November</month> 
    <month length="31" abbr="Dec">December</month> 
</xsl:variable> 

И соответственно, я изменил код, который первоначально использует документ() от:
[из месяца обработка бит таблицы стилей EXSLT]

<xsl:variable name="month-node" select="document('')/*/date:months/date:month[number($month)]" /> 

использовать функцию MSXML3.0 набор узлов:

<xsl:variable name="month-node" select="msxsl:node-set($months)/month[number($month)]" /> 

Поэтому я предположил, что это будет работать.

В соответствии с инструкциями EXLT «Строка шаблона формата интерпретируется, как описано для JDK 1.1 SimpleDateFormat class.» [Я использовал текущую версию].

Я указываю месяц в соответствии с SimpleDateFormat class как «dd MMMMM yyyy», так что месяц будет полным месяцем, например, январем. Но это не работает :(Я просмотрел таблицу стилей EXSLT, и у нее есть логика для этого. Также есть логика для отображения названия недели в течение дня с использованием шаблона «E», который не работает для меня. Может быть, меняется с помощью документа() к переменным преломил.

бы очень признателен за любую помощь.

Большое спасибо!

Примеры

<xsl:call-template name="date:format-date"> 
    <xsl:with-param name="date-time" select="'2010-07-01'"/> 
    <xsl:with-param name="pattern" select="'dd MMMMM yyyy'" /> 
</xsl:call-template> 

Как я понял из SimpleDateFormat class Docs это должно привести к 01 июля 2010 и что я получаю



<xsl:call-template name="date:format-date"> 
    <xsl:with-param name="date-time" select="'2010-07-01'"/> 
    <xsl:with-param name="pattern" select="'EEE, dd MMMMM yyyy'" /> 
</xsl:call-template> 

Это должно привести к пн, 01 июля 2010 и что я получаю , 01 07 2010

ответ

0

Когда вы используете msxml:node-set на корневом фрагменте XML (например, ваш список месяцев), функция auto matically создает корень, чтобы содержать фрагмент.

Так что в вашем случае ваш путь из множества узлов является неправильным:

msxsl:node-set($months)/month[number($month)] 

Это неправильно, потому что /month не корень $months. Вы можете исправить это легко, пропуская искусственный корень и собирается в месяц непосредственно:

msxsl:node-set($months)//month[number($month)] 

Обратите внимание на // оператор вместо оператора /.

EDIT

После тестирования я вижу, что я неправ. Фактически, оригинальный фрагмент, который вы используете, отлично подходит для меня. Оператор // не нужен. Вы уверены, что ваша $month переменная установлена ​​правильно?

+0

@Welbog: Я думаю, что это так. Я отредактировал структуру в $ month, чтобы использовать ее без document(). Я получаю результаты, но не точно сформирован правильно. Я добавил примеры в вопрос. – DashaLuna

0

Согласно странице EXSLT вы ссылаетесь (date:format-date template EXSLT file):

Там в настоящее время нет XSLT процессоры , которые мы знаем из этой даты поддержка : формат-дата изначально.

Какую реализацию вы используете? Кажется, что это не поддерживается в MSXML.