2016-05-27 2 views
1

J'ai ce simple fichier XMLXSL comment trouver le jour julien pour une date précise?

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="faan.xsl"?> 
<datum>2016-05-17</datum> 

Je veux utiliser XSL (XSL 2.0 et extensions n'est pas une option) pour calculer jour julien pour cette date (réponse correcte est 2457526, cette pratique est juste!) et est venu avec cette feuille de style qui semble être copié-collé dans de nombreux endroits. Mais, quand un ouvrir le fichier dans l'Explorateur, il me donne juste la date 2016-05-17, et quand je l'ouvre dans Excel, il dit que je ne peux pas utiliser xsl: with-param à cet endroit. J'ai évidemment manqué quelque chose de très simple, mais quoi?

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:for-each select="datum"> 
    <xsl:sort select="datum"/> 
      <dateline> 
       <datum><xsl:value-of select="datum"/></datum> 
      </dateline> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template match="datum"> 
    <xsl:call-template name="calculate-julian-day" /> 
     <xsl:with-param name="year" select="substring(datum,1,4)" /> 
     <xsl:with-param name="month" select="substring(datum,6,2)" /> 
     <xsl:with-param name="day" select="substring(datum,9,2)" /> 
</xsl:template> 

<xsl:template name="calculate-julian-day"> 
    <xsl:param name="year"/> 
    <xsl:param name="month"/> 
    <xsl:param name="day"/> 

    <xsl:variable name="a" select="floor((14 - $month) div 12)"/> 
    <xsl:variable name="y" select="$year + 4800 - $a"/> 
    <xsl:variable name="m" select="$month + 12 * $a - 3"/> 

    <xsl:value-of select="$day + floor((153 * $m + 2) div 5) + $y * 365 + floor($y div 4) - floor ($y div 100) + floor($y div 400) - 32045"/> 
</xsl:template> 

</xsl:stylesheet> 
+0

Vous avez des problèmes de syntaxe de base: vous devez placer 'xsl param' ** inside ** 'xsl: call-template'. Et le modèle correspondant 'datum' n'est jamais appliqué. –

Répondre

0

Voici une solution possible:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 


    <xsl:template match="datum"> 
    <xsl:call-template name="date-to-julian-day"> 
     <xsl:with-param name="date" select="."/> 
    </xsl:call-template> 
    </xsl:template> 

<!-- 
========================================================================== 
    Template: date-to-julian-day 
Description: Convert a date to julian day 
Parameters:- 
    <year> <month> <day> 
    or 
    <date> (format: yyyymmdd or yyyy-mm-dd) 
========================================================================== --> 
    <xsl:template name="date-to-julian-day"> 
     <xsl:param name="year"/> 
     <xsl:param name="month"/> 
     <xsl:param name="day"/> 
     <!-- or --> 
     <xsl:param name="date" select="''"/> 
     <!-- trim down date --> 
     <xsl:variable name="tdate" select="translate($date,'-','')"/> 
     <!-- decide which params were passed --> 
     <xsl:variable name="yyyy"> 
      <xsl:choose> 
      <xsl:when test="string-length($date) &gt; 0"> 
       <xsl:value-of select="substring($tdate,1,4)"/> 
      </xsl:when> 
      <xsl:otherwise><xsl:value-of select="$year"/></xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
     <xsl:variable name="mm"> 
      <xsl:choose> 
       <xsl:when test="string-length($date) &gt; 0"> 
       <xsl:value-of select="substring($tdate,5,2)"/> 
       </xsl:when> 
       <xsl:otherwise><xsl:value-of select="$month"/></xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
     <xsl:variable name="dd"> 
      <xsl:choose> 
       <xsl:when test="string-length($date) &gt; 0"> 
        <xsl:value-of select="substring($tdate,7,2)"/> 
       </xsl:when> 
       <xsl:otherwise><xsl:value-of select="$day"/></xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
     <!-- pre-calcs --> 
     <xsl:variable name="j0" select="ceiling(($mm - 14) div 12)"/> 
     <xsl:variable name="j1" select="floor((1461 * ($yyyy + 4800 + $j0)) div 4)"/> 
     <xsl:variable name="j2" select="floor((367 * ($mm - 2 - (12 * $j0))) div 12)"/> 
     <xsl:variable name="j3" 
         select="floor((3 * floor(($yyyy + 4900 + $j0) div 100)) div 4)"/> 
     <!-- final calc --> 
     <xsl:value-of select="$j1 + $j2 - $j3 + $dd - 32075"/> 
    </xsl:template> 

</xsl:stylesheet> 

Lorsque cette transformation est appliquée sur le document XML fourni:

<datum>2016-05-17</datum> 

le désiré, résultat correct est produit:

2457526 

Attribution:

Le code fourni fait partie de la bibliothèque datetime_lib.xsl XSLT 1.0 de modèles pour Arithmétique date-heure et les conversions, écrites par mon ami Martin Rowlinson - l'auteur de XSelerator - le meilleur XSLT IDE, qui est toujours un exemple brillant d'interface utilisateur puissante et conviviale. avec-:

Parfois, autour de 2010, le XSelerator est disponible gratuitement sur sourceforge.net, ce qui est de savoir comment les gens généralement se procurer ces bibliothèques de modèles précieux ..

+0

Il n'y a rien de mal avec le (beaucoup plus court) modèle que OP utilise. Ses problèmes sont ailleurs. –

+0

Et il n'y a rien de mal à lui montrer une meilleure solution. –

+0

Je suis très reconnaissant. Et je me rends compte que je dois répéter beaucoup de choses sur XSL ... –