2010-04-28 23 views
1

J'utilise date:format-date template EXSLT file J'utilise XSLT 1.0 et MSXML3.0 comme processeur.Date EXSLT: format-date modèle sans document() XSLT 1.0

Ma date: modèle format Date de la déclaration du fichier est 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> 

Je ne peux pas utiliser la fonction document() en raison des restrictions 3ème partie. J'ai donc changé les mois et les jours (de même) de XML extrait:

<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> 

à la variable:

<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> 

Et en conséquence, j'ai changé le code qui utilise initialement le document() fonction à partir de:
[à partir du bit de traitement mensuel de la feuille de style EXSLT]

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

pour utiliser la fonction set nœud MSXML3.0:

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

Je suppose que cela fonctionnerait.

Selon les instructions EXLT "La chaîne de modèle de format est interprétée comme décrit pour le JDK 1.1 SimpleDateFormat class." [J'ai utilisé la version actuelle].

Je spécifie le mois en conformité avec SimpleDateFormat class comme 'jj MMMMM aaaa' afin que le mois soit le nom complet du mois, par exemple janvier. Mais cela ne fonctionne pas :(J'ai regardé dans la feuille de style EXSLT et il a la logique de faire cela.Il est également logique d'afficher le nom de la semaine pour un jour en utilisant le modèle 'E', ce qui ne fonctionne pas pour moi. peut-être changer d'utiliser le document() pour les variables rompit.

apprécierions vraiment aucune aide.

Un grand merci!

EXEMPLES

<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> 

Comme je comprends SimpleDateFormat class docs cela devrait donner lieu à 01 Juillet 2010 et ce que je reçois est



<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> 

Cela devrait entraîner Lun 01 Juillet 2010 et ce que je reçois est , 01 07 2010

Répondre

0

Lorsque vous utilisez msxml:node-set sur un fragment racine de XML (comme votre liste de mois), la fonction auto crée automatiquement une racine pour contenir le fragment.

Donc dans votre cas votre chemin à partir du jeu de nœuds est erroné:

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

Ceci est faux, car /month n'est pas la racine de $months. Vous pouvez facilement corriger en sautant la racine artificielle et va directement mois:

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

Notez le opérateur // au lieu de l'opérateur /.

EDIT

Lors des essais, je vois que je me trompe. En fait, l'extrait original que vous utilisez fonctionne bien pour moi. L'opérateur // est inutile. Êtes-vous sûr que votre variable $month est définie correctement?

+0

@Welbog: Je pense que oui. J'ai édité la structure de $ mois pour que je puisse l'utiliser sans document(). J'obtiens des résultats, mais pas exactement formalisés correctement. J'ai ajouté des exemples dans la question. – DashaLuna

0

Selon la page EXSLT vous faites référence (date:format-date template EXSLT file):

Il n'y a pas de processeurs XSLT que nous connaissons cette date support: format natif jour.

Quelle implémentation utilisez-vous? Il ne semble pas être pris en charge de manière native dans MSXML.