EXSLT date: шаблон формата даты без документа () XSLT 1.0 - PullRequest
1 голос
/ 28 апреля 2010

Я использую дата: шаблон формата даты EXSLT-файл Я использую XSLT 1.0 и MSXML3.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>

Я не могу использовать функцию document () из-за ограничений третьих лиц. Поэтому я изменил месяцы и дни (аналогично) из фрагмента 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>

И, соответственно, я изменил код, который изначально использует функцию document () с:
[из бита обработки месяца таблицы стилей 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. " [Я использовал текущую версию].

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

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

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

Примеры

<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 документов, это должно привести к 01 июля 2010 , и я получу 01 07 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

Ответы [ 2 ]

0 голосов
/ 29 апреля 2010

В соответствии со страницей EXSLT, на которую вы ссылаетесь ( дата: шаблон формата даты, файл EXSLT ):

В настоящее время нет процессоров XSLT. что мы знаем об этой поддержке дата: формат даты-родной.

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

0 голосов
/ 28 апреля 2010

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

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

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

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

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

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

EDIT

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

...