XSLT สามารถแทรกวันที่ปัจจุบันได้หรือไม่?


95

โปรแกรมที่เราใช้ในรายงานการส่งออกสำนักงานของฉันโดยแปลไฟล์ XML ที่ส่งออกด้วยไฟล์ XSLT เป็น XHTML ฉันเขียน XSLT ใหม่เพื่อเปลี่ยนการจัดรูปแบบและเพิ่มข้อมูลเพิ่มเติมจากไฟล์ XML ต้นทาง

ฉันต้องการรวมวันที่สร้างไฟล์ไว้ในรายงานขั้นสุดท้าย แต่วันที่ / เวลาปัจจุบันไม่รวมอยู่ในไฟล์ XML ดั้งเดิมและฉันไม่มีส่วนควบคุมใด ๆ เกี่ยวกับวิธีสร้างไฟล์ XML ดูเหมือนจะไม่มีการสร้างฟังก์ชันวันที่ใน XSLT ที่จะส่งคืนวันที่ปัจจุบัน

ใครมีความคิดบ้างไหมว่าฉันจะรวมวันที่ปัจจุบันระหว่างการแปลง XSLT ได้อย่างไร


ฉันไม่รู้ว่ามีการใช้โปรแกรมแยกวิเคราะห์ใดที่เป็นปัญหา โปรแกรมที่ฉันใช้ส่งออกรายงานโดยตรงและใช้ไฟล์ XSLT ในไดเร็กทอรีโปรแกรมเพื่อสร้างรายงาน
Eric Anastas

คำตอบ:


117

XSLT 2

ฟังก์ชันวันที่พร้อมใช้งานโดยกำเนิดเช่น:

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

นอกจากนี้ยังมีและcurrent-date()current-time()

XSLT 1

ใช้แพ็คเกจส่วนขยายวันที่และเวลา EXSLT

  1. ดาวน์โหลดวันที่และเวลาแพคเกจจากGitHub
  2. แยกdate.xslไปยังตำแหน่งของไฟล์ XSL ของคุณ
  3. ตั้งค่าส่วนหัวสไตล์ชีท
  4. date.xslนำเข้า

ตัวอย่างเช่น:

<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 #อย่าใช้เวลามากเกินไปในการพยายามรับการนำเข้า EXSLT ที่ทำงานร่วมกับหม้อแปลง. NET XSLT มาตรฐานให้ใช้MVP.XMLทันที มีการรองรับ ESXLT ในตัว
Joel Purra

15

สำหรับโปรแกรมแยกวิเคราะห์ MSXML ให้ลองทำดังนี้:

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

อ่านXSLT Stylesheet Scripting โดยใช้ msxsl: scriptและExtending XSLT ด้วย JScript, C # และ Visual Basic .NET


สิ่งนี้ใช้ไม่ได้กับ Apache FOP เป็นหม้อแปลง ข้อความแสดงข้อผิดพลาด: วิธีการเรียกใช้วิธีการอินสแตนซ์วันนี้ต้องการอินสแตนซ์วัตถุเป็นอาร์กิวเมนต์แรก
Trey Carroll

1
อ๊ะ: extension-element-prefixes = "msxml" ควรเป็น extension-element-prefixes = "msxsl" ล้มเหลวในการทำงานในระบบของฉันเช่นกัน
Jay

14

คุณสามารถควบคุมการดำเนินการเปลี่ยนแปลงได้หรือไม่? ในกรณีนี้คุณสามารถส่งต่อวันที่ปัจจุบันไปยัง XSL และใช้ $ current-date จากภายใน XSL ของคุณ ด้านล่างนี้คือวิธีที่คุณประกาศพารามิเตอร์ขาเข้า แต่เมื่อทราบว่าคุณกำลังเรียกใช้การเปลี่ยนแปลงอย่างไรฉันไม่สามารถบอกคุณได้ว่าจะส่งผ่านค่านี้อย่างไร

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

ตัวอย่างเช่นจากสคริปต์ทุบตีให้ใช้:

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

จากนั้นใน xsl คุณสามารถใช้:

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

1
แท้จริงแล้ววิธีการส่งผ่านค่านั้นขึ้นอยู่กับระบบ ทางเลือกหนึ่งที่เป็นไปได้: กับxsltprocบน UNIX xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xmlมันอาจจะเป็น: บางระบบก็ใช้พารามิเตอร์เช่น$param=valueกันดังนั้นในกรณีนี้จะ$current-date=`date +%Y-%m-%d`อยู่ที่ไหนสักแห่ง หรือหาวิธีระบุพารามิเตอร์ในโปรเซสเซอร์ XSLT ที่คุณใช้อยู่
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

คำตอบล่าช้า แต่โซลูชันของฉันใช้งานได้ใน Eclipse XSLT Eclipse ใช้ XSLT 1 ในขณะที่เขียนนี้ คุณสามารถติดตั้งเอนจิ้น XSLT 2 เช่น Saxon หรือคุณสามารถใช้โซลูชัน XSLT 1 ด้านล่างเพื่อแทรกวันที่และเวลาปัจจุบัน

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

สิ่งนี้จะเรียกคลาส Data ของ Java เพื่อส่งออกวันที่ จะใช้ไม่ได้เว้นแต่คุณจะใส่คำจำกัดความ "java:" ต่อไปนี้ใน<xsl:stylesheet>แท็กของคุณ

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

ฉันหวังว่าจะช่วยใครบางคน คำตอบง่ายๆนี้หาได้ยากสำหรับฉัน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.