2016-05-27 1 views
1

私は(正しい答えは2457526で、これはただの練習です!)この日のためにユリウス日を算出する(XSL 2.0および拡張がオプションではありません)XSLを使用したい、このシンプルなXMLファイルXSLどのように特定の日付のユリウス日を見つけるには?

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

を持っていますこのスタイルシートは多くの場所にコピーペーストされているように見えました。 しかし、エクスプローラでファイルを開くと、日付2016-05-17が表示されます。Excelで開くと、ここではxsl:with-paramを使用できません。 私は明らかに何かを非常にシンプルに逃しましたが、何ですか?ここ

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

です:あなたは '配置する必要があるのxsl:with- 'xsl:call-template'の中で' 'param''を実行します。そして、テンプレートと一致する 'datum'は決して適用されません。 –

答えて

0

一つの可能​​な解決策ある:希望、正しい結果が生成される

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

:この変換が提供されるXML文書に適用される場合

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

2457526 

帰属

提供されているコードは、私の友人マーティンRowlinsonによって書かれた日時の算術演算および変換のためのテンプレートのdatetime_lib.xsl XSLT 1.0ライブラリの一部である - XSeleratorの著者 - 今までにない最高のXSLT IDEです。これは、ユーザーフレンドリーで強力なUIの輝かしい例です。

は時々2010年の周りにXSeleratorはsourceforge.net上で自由に利用可能であった、これはあなたが基本的な構文の問題を抱えている...人々は通常、これらの貴重なテンプレートライブラリを手に入れるだろうか

+0

OPが使用している(はるかに短い)テンプレートで問題はありません。彼の問題は他のところにある。 –

+0

そして彼にもっと良い解決策を見せても間違いはありません。 –

+0

私は非常に感謝しています。そして、私はXSLについてかなりのことを繰り返す必要があることを実感します..... –

関連する問題