2009-01-28 55 views
5

Tôi đang cố chuyển đổi ngày giờ thành định dạng ngày yyyy-MM-dd, bởi vì tôi đang sử dụng công cụ xsd.exe các kiểu dữ liệu ngày xs: được tự động thay đổi thành kiểu dữ liệu datetime, vì không có loại trong Khuôn khổ .NET khớp với loại xs: date hoàn toàn.Ngày giờ chuyển đổi XSLT sang định dạng ngày

Nhưng tôi không thể làm cho nó hoạt

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

cố gắng để chuyển đổi xml để

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

hiện tôi đang sử dụng XSLT này

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

Có ai biết một xsl tốt không t chuyển đổi.

Cảm ơn trước

Sản lượng kết quả của mã của tôi là

<articles /> 

Trả lời

1

Nhờ Stesoc và annakata I figured it out Đây là mã bây giờ tôi đang sử dụng và nó hoạt động hoàn hảo

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

+0

Tại sao bạn làm công cụ "local-name()" phức tạp? – Tomalak

+0

gì Tomalak nói - đòn bẩy xsl: sao chép – annakata

+0

Annakata Tôi đã cố gắng đề nghị đầu tiên của bạn với kết quả: 2009-01 -292009-01-30 Hay tôi đã làm gì sai? nhưng là tên địa phương() hơn là một hàm để tránh? thời gian thời gian bây giờ là 15-30 ms – freggel

7

Thẳng thắn mà nói, điều này có vẻ về đúng với tôi - đôi khi một chuỗi đơn giản là đủ tốt.

Tuy nhiên, nếu bạn đang ở trong đất .NET và bạn đang thực sự cần thêm chức năng NET có XSLT Extension Objects


chỉnh sửa: OIC, bạn đã có một căn bản apply-templates vấn đề khái niệm. Cố gắng này (lưu ý sao chép và mẫu gốc trận đấu):

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

mẫu là một khái niệm khó khăn để tìm hiểu, bạn có thể được tốt hơn off bắt đầu với đơn giản hơn for-each, và/hoặc có vẻ như bạn có thể làm với một số Hướng dẫn/sách XSLT.

+1

Bật "sử dụng đơn giản hơn cho mỗi": http://gregbeech.com/blogs/tech/archive/2006/08/17/using-xsl-for-each-is-almost-always-wrong.aspx .Tôi bỏ phiếu để làm điều đó đúng từ đầu. :) – Tomalak

+0

Từ kinh nghiệm cá nhân của việc dạy XSLT cho người mới, tôi không đồng ý với điều đó - cho mỗi người là một khái niệm dễ hiểu và dễ hiểu, và nếu bất cứ thứ gì là một bàn đạp tiện dụng để giải thích khái niệm mẫu " điều này có thể làm được! " – annakata

+1

Liên kết mà Tomalak đưa cho bài viết của Greg Beech đã thay đổi; bây giờ là http://gregbeech.com/blog/using-xsl-for-each-is-almost-always-wrong – Val

6

Formatting sẽ nhận được rất nhiều dễ dàng hơn trong XPath 2.0, mà Microsoft hiện đã từ chối hỗ trợ trong 8 năm qua. Kể từ khi vấn đề định dạng là thực sự chỉ kéo dài cho XSLT trong Net Tôi thích sử dụng một chức năng tùy chỉnh, đó là sạch & dễ dàng hơn:

XSLT Với Formatting Chức năng:

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> 

Cách sử dụng:

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

Khi bạn thực thi XSLT của mình trong. Net hãy đảm bảo rằng nó được tin cậy (để khối tập lệnh msxsl: script sẽ chạy.

XslCompiledTransform.Load(reader, XsltSettings.TrustedXslt, null); 
Các vấn đề liên quan