2009-01-28 23 views
5

Bir datetime tarih biçimini yyyy-MM-dd'ye dönüştürmeye çalışıyorum çünkü xsd.exe aracını kullanıyorum çünkü xs: date datatypes otomatik olarak datetime veri türüne dönüştürülüyor, Çünkü .NET Framework'de xs türüyle eşleşen hiçbir yazı yok: tarih tamamen.XSLT dönüşümü tarih formatı için tarih aralığı

Ama şu anda bu 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>  

kullanıyorum

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

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

xml dönüştürmek için çalışıyor çalışmak için alınamıyor

Herkes iyi bir xsl biliyor mu? t dönüşümü. peşin

yılında

sayesinde benim kod çıktısı sonucu

<articles /> 

cevap

1

teşekkürler ben bu şimdi kullanıyorum kodudur bunu anladım ve mükemmel çalışır

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

Biçimlendirme XPath'de çok daha kolay alacak
+0

Neden karmaşık "yerel ad()" şeyleri yapıyorsunuz? – Tomalak

+0

ne tomalak söyledi - kaldıraç xsl: copy – annakata

+0

Annakata İlk öneri denedim sonucu: 2009-01 -292009-01-30 Ya da yanlış bir şey mi yaptım? ama önlemek için bir işlevden yerel adı() nedir? süre süresi şimdi 15-30 ms – freggel

7

Açıkçası, bu bana yaklaşık haklı görünüyor - bazen basit bir alt dize yeterince iyidir.

Ancak, .NET arazi demektir ve gerçekten ekstra işlevsellik .NET gerek eğer XSLT Extension Objects


düzenleme olduğu: oik, temel uygulamak-şablonları kavramsal bir problem var. Bu (kopya ve kök şablon maçı unutmayın) deneyin:

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

şablonları öğrenmek için zor bir kavramdır, daha basit for-each ile başlayan daha iyi olabilir ve/veya bazı yapabileceğini görünüyor XSLT öğreticiler/kitaplar. Stesoc ve annakata için

+1

"Her biri için daha kolay olanı kullanma" hakkında: http://gregbeech.com/blogs/tech/archive/2006/08/17/using-xsl-for-each-is-almost-always-wrong.aspx .Baştan beri düzgün yapmak için oy veriyorum. :) – Tomalak

+0

XSLT'yi yeni başlayanlara öğretme konusundaki kişisel deneyimlerinden, buna kesinlikle katılmıyorum - her biri için çevrilebilir ve kolay anlaşılır bir kavram, ve eğer şablon konseptini açıklamak için kullanışlı bir sıçrama tahtası varsa, şimdi bunu anladınız, Bu yapabilir! " – annakata

+1

Tomalak'ın Greg Beech makalesine verdiği link değişti; şimdi http://gregbeech.com/blog/using-xsl-for-each-is-almost-always-wrong – Val

6

Microsoft, şu anda son 8 yıldır desteklemeyi reddetti. biçimlendirme sorunu .NET XSLT için gerçekten sadece kalıcı olduğundan I özel bir işlevi, kullanmak ister temizleyici & kolay:

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> 

Kullanımı:

<xsl:value-of select="user:FormatDate(@transactionDate)"/> 
<xsl:value-of select="user:FormatCurrency(@amount)"/> 
Biçimlendirme Fonksiyon ile

XSLT

XSLT'nizi .Net içinde çalıştırdığınızda, güvenilir olduğundan emin olun (böylece msxsl: script bloğu çalışır.

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