2012-04-30 294 views
2

我遇到了一個問題,我收到一個XML文件,並從我得到的日期格式是mm/dd/yyyy,有時它是m/d/yyyy。我的任務是將其轉換爲模式只接受yyyy-mm-dd的另一個XML文件。我僅限於使用XSLT 1.0/XPATH 1.0。我怎樣才能做到這一點?XSLT轉換日期格式

+0

上驗證了這個解決方案,那麼你怎麼解釋'11/12/2012'? 你需要用關於哪種情況適用於哪種格式的規則來澄清你的問題。 –

+0

源模式爲2012年12月11日,目標模式將需要2012-11-12(解釋爲2012年11月12日)。 – TimWagaman

回答

8

你的問題有點含糊。它需要一些樣本輸入和預期輸出。但無論如何,這裏是對你想要的最好猜測的答案。

鑑於這種輸入:

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

...通過這個樣式表變換...

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

...會產生這個所需的輸出...

<dates> 
<date>2012-11-12</date> 
<date>2011-03-04</date> 
</dates> 

如果它是正確的,請打勾。我在http://www.purplegene.com/static/transform.html

+0

Dogbane的解決方案是非常類似於我的,但他擊敗了我的一拳。不過,我認爲我的解決方案比較簡單,讀得更好。邁凱倫的解決方案在2012年1月12日的字符串長度爲9的日期不起作用。 –

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

你好團隊! 看到下面,暴露格式dateTime: http://stackoverflow.com/a/16892467/2816548 –