2009-01-28 125 views
5

我想將日期時間轉換爲日期格式yyyy-MM-dd,因爲我使用xsd.exe工具xs:date數據類型會自動更改爲datetime數據類型,因爲.NET Framework中沒有類型完全匹配類型xs:date。XSLT轉換datetime到日期格式

但我不能讓它工作

<articles> 
     <article> 
      <articleid>48992</articleid> 
      <deliverydateasked>2009-01-29T00:00:00+01:00</deliverydateasked> 
     </article> 
     <article> 
      <articleid>48993</articleid> 
      <deliverydateasked>2009-01-30T00:00:00+01:00</deliverydateasked> 
     </article> 
</articles> 

試圖將XML轉換爲

<articles> 
     <article> 
      <articleid>48992</articleid> 
      <deliverydateasked>2009-01-29</deliverydateasked> 
     </article> 
     <article> 
      <articleid>48993</articleid> 
      <deliverydateasked>2009-01-30</deliverydateasked> 
     </article> 
</articles> 

我目前使用這個XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:template match="/"> 
    <articles> 
     <xsl:apply-templates select="article"> 
     </xsl:apply-templates> 
      </articles> 
</xsl:template> 

<xsl:template name="FormatDate"> 

    <xsl:param name="DateTime" /> 
    <xsl:variable name="date"> 
     <xsl:value-of select="substring-before($DateTime,'T')" /> 
    </xsl:variable> 

    <xsl:if test="string-length($date) != 10"> 
     <xsl:value-of select="$DateTime"/> 
    </xsl:if> 
    <xsl:if test="string-length($date) = 10"> 
     <xsl:value-of select="$date"/> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="article"> 
     <xsl:call-template name="FormatDate"> 
      <xsl:with-param name="DateTime" select="deliverydateasked"/> 
     </xsl:call-template>  
</xsl:template>  

有誰知道一個好的xsl t轉型。

在此先感謝

我的代碼的輸出結果是

<articles /> 

回答

1

感謝Stesoc和annakata我想通了 這是我現在使用的代碼和它的作品完美

<xsl:template match="*"> 
    <xsl:param name="parentElm"> 
     <xsl:value-of select="name(..)" /> 
    </xsl:param> 
    <xsl:choose> 
     <xsl:when test="local-name() = 'deliverydateasked'"> 
      <xsl:element name="deliverydateasked"> 
       <xsl:call-template name="FormatDate"> 
        <xsl:with-param name="DateTime" select="."/> 
       </xsl:call-template> 
      </xsl:element> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:element name="{local-name()}"> 
       <xsl:copy-of select="@*" /> 
       <xsl:apply-templates select="@* | node()" /> 
      </xsl:element> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template name="FormatDate"> 
    <xsl:param name="DateTime" /> 
    <xsl:variable name="date"> 
     <xsl:value-of select="substring-before($DateTime,'T')" /> 
    </xsl:variable> 

    <xsl:if test="string-length($date) != 10"> 
     <xsl:value-of select="$DateTime"/> 
    </xsl:if> 
    <xsl:if test="string-length($date) = 10"> 
     <xsl:value-of select="$date"/> 
    </xsl:if> 
</xsl:template>  

7

坦率地說,這看起來對我的權利 - 有時一個簡單的字符串是不夠好。

但是,如果你在.NET土地,你真的需要額外的功能,.NET具有XSLT Extension Objects


編輯:伊斯蘭會議組織,您已經有了一個基本的申請模板概念上的問題。試試這個(注意副本和根模板匹配):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

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

<xsl:template match="deliverydateasked"> 
    <xsl:copy> 
     <xsl:call-template name="FormatDate"> 
      <xsl:with-param name="DateTime" select="."/> 
     </xsl:call-template>  
    </xsl:copy> 
</xsl:template> 

<xsl:template name="FormatDate"> 

     <xsl:param name="DateTime" /> 
     <xsl:variable name="date"> 
       <xsl:value-of select="substring-before($DateTime,'T')" /> 
     </xsl:variable> 

     <xsl:if test="string-length($date) != 10"> 
       <xsl:value-of select="$DateTime"/> 
     </xsl:if> 
     <xsl:if test="string-length($date) = 10"> 
       <xsl:value-of select="$date"/> 
     </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

模板是一個困難的概念學習,你可能會更好先從更直接for-each,和/或它似乎你可以與一些做XSLT教程/書籍。

+1

關於「使用更直接的for-each」:http://gregbeech.com/blogs/tech/archive/2006/08/17/using-xsl-for-each-is-almost-always-wrong.aspx 。我投票從一開始就做好了。 :) – Tomalak 2009-01-29 07:31:51

+0

從我個人的XSLT教學經驗來看,我強烈反對 - 因爲每一個都是一個可翻譯和易於理解的概念,如果有什麼是一個方便的跳板來解釋模板概念「現在你已經知道了,看看什麼這可以做!「 – annakata 2009-01-29 10:04:32

6

格式化將在XPath中得到很多容易2.0,微軟目前拒絕支持過去8年。由於格式問題真的是隻爲XSLT在.net執着,我喜歡使用自定義功能,這是清潔&簡單:

XSLT隨着格式化功能:

xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:user="http://www.tempuri.org/User"> 

    <msxsl:script implements-prefix="user" language="C#"> 
     <![CDATA[ 
      public string FormatCurrency(string amount) 
      { 
      return decimal.Parse(amount).ToString("C0"); 
      } 

      public string FormatDate(string dateValue) 
      { 
      return DateTime.Parse(dateValue).ToString("MM/dd/yyyy hh:mm"); 
      } 
      ]]> 
     </msxsl:script> 

用法:

<xsl:value-of select="user:FormatDate(@transactionDate)"/> 
<xsl:value-of select="user:FormatCurrency(@amount)"/> 

當您在.Net中執行您的XSLT時,請務必告訴它它是受信任的(以便msxsl:腳本塊可以運行)

XslCompiledTransform.Load(reader, XsltSettings.TrustedXslt, null);