Bir XSLT güncel tarihi ekleyebilir mi?


95

Ofisimde kullandığımız bir program, bir XSLT dosyasıyla dışa aktardığı bir XML dosyasını XHTML'ye çevirerek raporları dışa aktarıyor. Biçimlendirmeyi değiştirmek ve kaynak XML Dosyasından daha fazla bilgi eklemek için XSLT'yi yeniden yazıyorum.

Dosyanın oluşturulduğu tarihi nihai rapora eklemek istiyorum. Ancak geçerli tarih / saat orijinal XML dosyasına dahil edilmedi ve XML dosyasının nasıl oluşturulduğu konusunda herhangi bir kontrolüm yok. XSLT'de mevcut tarihi döndürecek herhangi bir tarih işlevi görünmüyor.

XSLT dönüşümüm sırasında güncel tarihi nasıl dahil edebileceğim konusunda herhangi bir fikri olan var mı?


Hangi ayrıştırıcının kullanıldığını bilmiyorum, sorun bu. Kullandığım program raporları doğrudan dışa aktarıyor ve raporları oluşturmak için program dizinindeki XSLT dosyasını kullanıyor.
Eric Anastas

Yanıtlar:


117

XSLT 2

Tarih işlevleri yerel olarak mevcuttur, örneğin:

<xsl:value-of  select="current-dateTime()"/>

Ayrıca current-date()ve vardır current-time().

XSLT 1

EXSLT tarih ve saat uzatma paketini kullanın.

  1. İndir tarih ve saatleri paketi GitHub'dan .
  2. Özü date.xslXSL dosyalarının konumuna.
  3. Stil sayfası başlığını ayarlayın.
  4. İçe aktar date.xsl.

Örneğin:

<xsl:stylesheet version="1.0" 
    xmlns:date="http://exslt.org/dates-and-times" 
    extension-element-prefixes="date"
    ...>

    <xsl:import href="date.xsl" />

    <xsl:template match="//root">
       <xsl:value-of select="date:date-time()"/>
    </xsl:template>
</xsl:stylesheet>


7
.Net / c # kullanan herkes için , standart .NET XSLT transformatörleriyle çalışarak EXSLT içe aktarımlarını almaya çalışmak için çok fazla zaman harcamayın - hemen MVP.XML kullanın . Bu gelmiştir yerleşik ESXLT desteği .
Joel Purra

15

MSXML ayrıştırıcısı için şunu deneyin:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:my="urn:sample" extension-element-prefixes="msxml">

    <msxsl:script language="JScript" implements-prefix="my">
       function today()
       {
          return new Date(); 
       } 
    </msxsl:script> 
    <xsl:template match="/">

        Today = <xsl:value-of select="my:today()"/>

    </xsl:template> 
</xsl:stylesheet>

Ayrıca msxsl: script ve XSLT'yi JScript, C # ve Visual Basic .NET ile Genişletme kullanarak XSLT Stil Sayfası Komut Dosyası'nı okuyun


Bu, dönüştürücü olarak Apache FOP ile çalışmaz. Hata iletisi: Bugün yönteme örnek yöntemi çağrısı, ilk bağımsız değişken olarak bir Object örneği gerektiriyor
Trey Carroll

1
oops: extension-element-prefixes = "msxml", extension-element-prefixes = "msxsl" olmalıdır. Benim sistemimde de çalışmıyor.
Jay

14

Dönüşümü yürütmek üzerinde kontrolünüz var mı? Öyleyse, geçerli tarihi XSL'ye aktarabilir ve XSL'nizin içinden $ current-date kullanabilirsiniz. Aşağıda, gelen parametreyi nasıl açıkladığınız açıklanmaktadır, ancak dönüşümü nasıl yürüttüğünüzü bilerek, size değeri nasıl aktaracağınızı söyleyemem.

<xsl:param name="current-date" />

Örneğin, bash komut dosyasından şunu kullanın:

xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml

Ardından, xsl'de şunları kullanabilirsiniz:

<xsl:value-of select="$current-date"/>

1
Nitekim değerin nasıl geçirileceği sisteme bağlıdır. Olası bir seçenek: ile xsltproc UNIX üzerinde, bu olabilir: xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml. Bazı sistemler $param=value, bu durumda bir $current-date=`date +%Y-%m-%d`yerde olduğu gibi sadece parametreleri de alır . Veya başka türlü, kullandığınız XSLT işlemcisindeki parametreleri belirtmenin yollarını arayın.
lindes

11
...
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:local="urn:local" extension-element-prefixes="msxsl">

    <msxsl:script language="CSharp" implements-prefix="local">
        public string dateTimeNow()
        {       
          return DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ"); 
        } 
    </msxsl:script>  
...
    <xsl:value-of select="local:dateTimeNow()"/>

8

Geç cevap, ancak çözümüm Eclipse XSLT'de çalışıyor. Eclipse bu yazının yazıldığı sırada XSLT 1 kullanıyor. Saxon gibi bir XSLT 2 motoru kurabilirsiniz. Veya geçerli tarih ve saati eklemek için aşağıdaki XSLT 1 çözümünü kullanabilirsiniz.

<xsl:value-of select="java:util.Date.new()"/>

Bu, tarihin çıktısını almak için Java'nın Veri sınıfını çağıracaktır. <xsl:stylesheet>Etiketinize aşağıdaki "java:" tanımını da koymadıkça çalışmayacaktır.

<xsl:stylesheet [...snip...]
         xmlns:java="java"
         [...snip...]>

Umarım bu birine yardımcı olur. Bu basit cevabı bulmak benim için zordu.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.