2012-04-30 2 views
2

私はXMLファイルを取得しているところに問題があります。取得する日付の形式は、mm/dd/yyyyで、時にはm/d/yyyyです。私の仕事は、スキーマがyyyy-mm-ddしか受け付けない別のXMLファイルに変換することです。私はXSLT 1.0/XPATH 1.0を使用することに限定されています。これどうやってするの?XSLTは日付形式を変換する

+0

あなたは'11/12/2012 'をどのように解釈しますか? 2つの形式のどちらをどのような場合に適用するかに関する規則を使用して質問を明確にする必要があります。 –

+0

ソーススキーマが2012年11月12日である場合、ターゲットスキーマは2012-11-12(2012年11月12日と解釈される)のスキーマを持つ必要があります。 – TimWagaman

答えて

8

あなたの質問は少し曖昧です。いくつかのサンプル入力と期待される出力が必要です。しかし、いずれにせよ、ここでは、あなたが望むところで最高の推測に対する答えがあります。

<?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="dates"> 
     <xsl:copy> 
     <xsl:apply-templates select="*" /> 
     </xsl:copy> 
     </xsl:template> 

     <xsl:template match="date"> 
     <xsl:copy> 
     <xsl:value-of select=" 
      concat(
      substring-after(substring-after(.,'/'),'/') , '-', 
      format-number(number(substring-before(.,'/')), '00') , '-', 
      format-number(substring-before(substring-after(.,'/'),'/'), '00') 
      ) 
      " /> 
     </xsl:copy> 
     </xsl:template> 

</xsl:stylesheet> 

が...この所望の出力を生成します。このスタイルシートによって変換さ

<?xml version="1.0"?> 
<dates> 
    <date>11/12/2012</date> 
    <date>3/4/2011</date> 
</dates> 

... ... ...

<dates> 
<date>2012-11-12</date> 
<date>2011-03-04</date> 
</dates> 
:この入力を考えると

答えが正しい場合は、それにチェックを入れてください。私はこの解決策を確認しましたhttp://www.purplegene.com/static/transform.html

+0

ドッグベーンのソリューションは私のものとよく似ていますが、彼は私をパンチに倒しました。それでも、私のソリューションは簡潔で読みやすいと思います。マクラーレンのソリューションは、文字列の長さが9の2012年1月12日のような日付では機能しません。 –

1

下記のXSLTが動作するはずです。ハードコーディングされた長さやインデックスは使用しませんが、代わりに日付文字列を '/'に分割して、日、月、および年のコンポーネントの場所を特定します。

XSLT:

<?xml version="1.0" encoding="utf-8"?> 

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

    <xsl:template match="/"> 
     <xsl:apply-templates /> 
    </xsl:template> 

     <!-- match the date and invoke formatDate to format it --> 
    <xsl:template match="date"> 
     <xsl:element name="date"> 
      <xsl:call-template name="formatDate"> 
       <xsl:with-param name="dateParam" select="." /> 
      </xsl:call-template> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template name="formatDate"> 
     <xsl:param name="dateParam" /> 
     <!-- input format mm/dd/yyyy or m/d/yyyy --> 
     <!-- output format yyyy-mm-dd --> 


     <!-- parse out the day, month and year --> 
     <xsl:variable name="month" select="substring-before($dateParam,'/')" /> 
     <xsl:variable name="day" select="substring-before(substring-after($dateParam,'/'),'/')" /> 
     <xsl:variable name="year" select="substring-after(substring-after($dateParam,'/'),'/')" /> 

     <!-- now print them out. Pad with 0 where necessary. --> 
     <xsl:value-of select="$year" /> 
     <xsl:value-of select="'-'" /> 
     <xsl:if test="string-length($month) = 1"> 
      <xsl:value-of select="'0'" /> 
     </xsl:if> 
     <xsl:value-of select="$month" /> 
     <xsl:value-of select="'-'" /> 
     <xsl:if test="string-length($day) = 1"> 
      <xsl:value-of select="'0'" /> 
     </xsl:if> 
     <xsl:value-of select="$day" /> 
    </xsl:template> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

入力:

<input> 
    <date>04/30/2012</date> 
    <date>4/1/2012</date> 
</input> 

出力:

<?xml version="1.0" encoding="UTF-8"?> 
<input> 
    <date>2012-04-30</date> 
    <date>2012-04-01</date> 
</input> 

デモhttp://www.xsltcake.com/slices/kBveVQ

+0

''を使用できるときは、 ''を使用しないでください。冗長で非効率的です! –

+0

それを指摘してくれてありがとう。私は私の答えを更新しました。 – dogbane

+0

こんにちはチーム! 以下を参照してください:format-dateTime: http://stackoverflow.com/a/16892467/2816548 –

関連する問題