我遇到了一個問題,我收到一個XML文件,並從我得到的日期格式是mm/dd/yyyy
,有時它是m/d/yyyy
。我的任務是將其轉換爲模式只接受yyyy-mm-dd
的另一個XML文件。我僅限於使用XSLT 1.0/XPATH 1.0。我怎樣才能做到這一點?XSLT轉換日期格式
回答
你的問題有點含糊。它需要一些樣本輸入和預期輸出。但無論如何,這裏是對你想要的最好猜測的答案。
鑑於這種輸入:
<?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
Dogbane的解決方案是非常類似於我的,但他擊敗了我的一拳。不過,我認爲我的解決方案比較簡單,讀得更好。邁凱倫的解決方案在2012年1月12日的字符串長度爲9的日期不起作用。 –
下面顯示的我的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>
當你可以使用'
感謝您指出。我已經更新了我的答案。 – dogbane
你好團隊! 看到下面,暴露格式dateTime: http://stackoverflow.com/a/16892467/2816548 –
- 1. XSLT轉換datetime到日期格式
- 2. xslt轉換日期時間格式
- 3. 將ISO日期格式轉換爲XSLT中的RFC 2822格式
- 4. XSLT格式日期
- 5. 轉換日期到MySQL日期格式
- 6. 轉換日期格式/加密日期
- 7. 轉換日期格式SQL
- 8. 轉換日期格式
- 9. 轉換日期格式
- 10. Metl - 轉換日期格式
- 11. 轉換日期格式
- 12. 日期格式轉換javascript
- 13. R:日期格式轉換
- 14. 日期格式轉換Ruby
- 15. 轉換日期格式
- 16. CMake轉換日期格式
- 17. 日期格式轉換javascript
- 18. 轉換日期格式
- 19. 轉換日期格式
- 20. Java日期格式轉換
- 21. javascript日期格式轉換
- 22. javascript日期格式轉換
- 23. 轉換日期格式
- 24. 轉換日期格式
- 25. iOS日期格式轉換?
- 26. 轉換日期格式Perl
- 27. 轉換此日期格式
- 28. 轉換日期格式
- 29. 轉換日期格式
- 30. 轉換日期格式
上驗證了這個解決方案,那麼你怎麼解釋'11/12/2012'? 你需要用關於哪種情況適用於哪種格式的規則來澄清你的問題。 –
源模式爲2012年12月11日,目標模式將需要2012-11-12(解釋爲2012年11月12日)。 – TimWagaman