2011-01-06 17 views
5

आइए कहें कि मेरे पास नोड्स की एक सूची है जिसमें एक विशेषता डेटाटाइम है, और मैं केवल तुलना-डेटाटाइम के बाद होने वाले रिकॉर्ड चुनना चाहता हूं।एक्सएसएलटी 1.0/XPath 1.0 तिथि सीमा से नोड्स का चयन करना। क्या यह भी संभव है?

<records> 
    <record @datetime="2010-01-04T16:48:15.501-05:00"/> 
    <record @datetime="2010-01-03T16:48:15.501-05:00"/> 
    ...etc... 
</records> 

XQuery दिनांक सीमा के अंदर आइटम का चयन करने में मैं इस हो रही पर किसी भी भाग्य के बिना,

/records/record[xs:dateTime(@datetime) > xs:dateTime($compare-datetime)] 

विभिन्न दृष्टिकोणों और जवाब के लिए खोज की बहुत की लेकिन XSLT 1.0 में मैं कोशिश की है बहुत कुछ करना होगा काम करने के लिए।

मुझे लगता है कि वास्तविक तिथि को पूर्ण करने के लिए एक पूर्णांक मान का समय, यह xslt में एक साधारण कार्य नहीं है।

मुझे उम्मीद है कि कोई मुझे उस पर एक निश्चित उत्तर दे सकता है ताकि मैं कम से कम जान सकूं कि मैं किसके खिलाफ हूं।

चीयर्स,

केसी

उत्तर

6

यदि तिथियां हमेशा एक ही समय क्षेत्र में होंगी, और निश्चित चौड़ाई वाले फ़ील्ड (प्रत्येक फ़ील्ड में अंकों की निरंतर संख्या) है, तो मेरा मानना ​​है कि आप this approach ले सकते हैं: विराम चिह्न हटाएं, संख्याओं को छोड़कर, संख्याओं की तुलना करें ।

<xsl:variable name="datetime-punctuation" select="'-.:T'" /> 
<xsl:variable name="stripped-compare-datetime" 
    select="number(translate($compare-datetime, $datetime-punctuation, ''))" /> 

फिर

/records/record[number(translate(@datetime, $datetime-punctuation, '')) 
       > $stripped-compare-datetime)] 
+0

+1। इसके बारे में भी सोचा। रास्ते से अधिक कुशल हो सकता है। – Flack

+0

@ फ्लैक, हाँ, मेरा कहना था कि यह एक और त्वरित और गंदे विधि है, जो उपर्युक्त बाधाओं को काम करेगा, और डेटाटाइम डेटा की पूरी पार्सिंग की आवश्यकता नहीं है। यह हमें दो चीजें के बीच अंतर जैसी अच्छी चीजें नहीं देगा, लेकिन ऐसा लगता है कि ओपी को इसकी आवश्यकता नहीं है। आप दोनों, दोस्तों के लिए – LarsH

+0

+1। –

1

मैं कर रहा हूँ डर है कि XSLT 1.0 datetimes के लिए कोई अंतर्निहित समर्थन हासिल है। यह संभव है कि आप पाएंगे कि किसी ने लाइब्रेरी लिखी है - XSLT FAQ पर एक नज़र डालें

एक्सएसएलटी 2.0 की पेशकश के लिए http://www.dpawson.co.uk/xsl/rev2/dates.html#d14938e16 देखें।

5

हो सकता है यह सबसे अच्छा समाधान नहीं है, लेकिन मैं इस है:

एक्सएमएल इनपुट:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="dates.xsl"?> 
<records> 
    <record datetime="2010-01-04T16:48:15.501-05:00"/> 
    <record datetime="2011-01-04T16:48:15.501-05:00"/> 
</records> 

XSLT:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:date="http://exslt.org/dates-and-times" 
    extension-element-prefixes="date"> 
    <xsl:import href="date.difference.template.xsl"/> 
    <!-- http://exslt.org/date/functions/difference/date.difference.template.xsl --> 
    <xsl:output method="xml" indent="yes"/>   

    <xsl:template match="/*"> 
     <xsl:copy> 
      <result1> 
       <xsl:call-template name="date:difference"> 
        <xsl:with-param name="start" select="record[1]/@datetime"/> 
        <xsl:with-param name="end" select="'2010-04-04T16:48:15.501-05:00'"/> 
       </xsl:call-template> 
      </result1> 
      <result2> 
       <xsl:call-template name="date:difference"> 
        <xsl:with-param name="start" select="record[2]/@datetime"/> 
        <xsl:with-param name="end" select="'2010-04-04T16:48:15.501-05:00'"/> 
       </xsl:call-template> 
      </result2> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

परिणाम:

<records> 
    <result1>P90D</result1> 
    <result2>-P275D</result2> 
</records> 

नकारात्मक अंतर इसका मतलब होगा पहली तारीख दूसरी तारीख के बाद होती है।

+0

अच्छा समाधान। आप दोनों, दोस्तों के लिए +1 – LarsH

+0

+1। –

+0

+1 अच्छा संसाधन। यह कवर जोन कनवर्टन लेकिन नामित टेम्पलेट (सख्त स्टैंडर के लिए) का उपयोग ** ** नोड्स चुनना ** कठिन काम करेगा। –

0

का उपयोग मैं आप के रूप में एक ही समस्या थी। मैं एक सी # विधि (तो यह केवल नेट XSLT के साथ काम करता है) का निर्माण किया:

<msxsl:script language="C#" implements-prefix="user"> 
    <![CDATA[ 
    public bool largerThan(DateTime dt0, DateTime dt1) { 
    return dt0 > dt1; 
    } 
    ]]> 
</msxsl:script> 

नामस्थान

xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:user="urn:my-scripts" 

और उपयोग के साथ (मेरी xslt दस्तावेज़ से झलकी)

<xsl:for-each select="../b:post[user:largerThan(@created,$created)]"> 
+0

हां, एक्सटेंशन फ़ंक्शन हमेशा "हल" कर सकते हैं कि भाषा (XPath 1.0) क्या कवर नहीं करती है। ** लेकिन इनलाइन फोरिंग भाषा परिभाषाएं मानक विस्तार तंत्र ** का हिस्सा नहीं हैं। एक्सएसएलटी प्रोसेसर संदर्भ में कार्यान्वयन को पंजीकृत करना स्टैंडर दृष्टिकोण है। –

+0

किसी भी व्यक्ति के लिए [टैग: .net]/[टैग: सी #] का उपयोग करने के लिए, मानक .NET XSLT ट्रांसफार्मर के साथ काम कर रहे EXSLT आयात प्राप्त करने का प्रयास करने में बहुत अधिक समय व्यतीत न करें - [MVP.XML] का उपयोग करें (http: // mvpxml .codeplex.com /) तुरंत। इसमें [ESXLT के लिए अंतर्निहित समर्थन] है (http://mvpxml.codeplex.com/wikipage?title=EXSLT.NET)। –

संबंधित मुद्दे