に変換します。任意の日付関数を使用するには、指定された文字列をYYYY-MM-DD
形式の有効な日付に変換する必要があります。これを済ませれば、計算はかなり簡単になります。
便宜上、次のスタイルシートは2つのカスタム定義関数を使用します.1つは文字列を適切な日付に変換し、もう1つは実際のユリウス日を計算するものです。
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="http://www.example.com/my"
exclude-result-prefixes="xs my">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:function name="my:reformat-date">
<xsl:param name="datestring"/>
<xsl:variable name="y" select="substring($datestring, 1, 4)"/>
<xsl:variable name="mmm" select="substring($datestring, 6, 3)"/>
<xsl:variable name="d" select="substring($datestring, 10, 2)"/>
<xsl:variable name="m" select="format-number(index-of(('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'), $mmm), '00')"/>
<xsl:sequence select="xs:date(concat($y, '-', $m, '-', $d))" />
</xsl:function>
<xsl:function name="my:julian-day-number">
<xsl:param name="date" as="xs:date"/>
<xsl:variable name="epoch" select="xs:date('-4714-11-24')"/>
<xsl:sequence select="days-from-duration($date - $epoch)"/>
</xsl:function>
<xsl:template match="/">
<result>
<xsl:value-of select="my:julian-day-number(my:reformat-date('2016-JUL-05'))" />
</result>
</xsl:template>
</xsl:stylesheet>
結果
<?xml version="1.0" encoding="UTF-8"?>
<result>2457575</result>
注:
厳密に言えば、ユリウス日NU正午に変更されます。あなたの入力が日の時刻を示さない場合、指定された日付のAMまたはPM部分の番号を選択するかどうかの決定は純粋に任意です。
こんにちはマイケル - ありがとうございます、これは正しいです(マークされています)。とても有難い。私は、日付の基準についてゆるやかに話しました。私は注意するために投稿を編集します。 1つの質問がありますが、ジュリアン関数の計算で "+ 1721426"を展開してください。 – Bacon2305
これは私が何かを学んだので、あなたがこれを尋ねてうれしいです。私は負の日付がXMLでは有効ではないと考えていたので、予防的なグレゴリオ暦の開始からの日数を計算し、4714年11月24日からの経過日数を取得するために必要なオフセットを追加しました。しかし、私は今、JDNのエポック・デートで直接動作することがわかりました。これにより、さらに簡単になります。 –