xslt एक्सएमएल रिकॉर्ड में सबसे हाल की तिथि प्राप्त करें




biztalk (2)

आपके लिखित संदर्भ 'कार्य' में दिनांक सॉर्ट करने का कारण यह था कि यह आपके yyyy-MM-dd प्रारूप में था, जो कि आपके dd-MM-yyyy प्रारूप के विपरीत है।

टिम सी / शॉन के प्रस्ताव का विकल्प सी # स्क्रिप्ट फ़ंक्शंस का उपयोग करना है (जब से आप बिज़टॉक का उपयोग कर रहे हैं) अपने लिंक के अनुसार दिनांक को वापस क्रमबद्ध करने के लिए - लेकिन ध्यान दें कि यह मूल एक्सएसएलटी फ़ंक्शंस के रूप में निष्पादक होने की संभावना नहीं है। नोट भी है कि आपको अपने चर पर एमएसएक्सएसएल: नोड-सेट का उपयोग करने की आवश्यकता हो सकती है ताकि बिज़टॉक के पार्सर को यह बताने के लिए कि यह एक टुकड़ा है।

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                exclude-result-prefixes="userCSharp msxsl"
                >
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <xsl:variable name="ClubRoot" select="/*[1]"/>
        <xsl:variable name="orderedPlayers">
            <xsl:for-each select="msxsl:node-set($ClubRoot)/*[local-name()='PlayingStaff']/*[local-name()='Player']">
                <xsl:sort select="userCSharp:makeSortableDate(string(*[local-name()='DateOfBirth']), 'dd-MM-yyyy')" order="descending"/>
                <xsl:copy-of select="node() | @*"/>
            </xsl:for-each>
        </xsl:variable>

        <xsl:variable name="youngestPlayerDOB">
            <xsl:value-of select="msxsl:node-set($orderedPlayers)[1]/DateOfBirth/text()" />
        </xsl:variable>

        <xsl:element name="blahhh">
            <xsl:variable name="IsYoungestPlayerUnderAgeLimit" select="userCSharp:externalfunctionreturningboolean($youngestPlayerDOB)" />
            <xsl:value-of select="$IsYoungestPlayerUnderAgeLimit"/>
        </xsl:element>
        <xsl:element name="blahhh">
            <xsl:value-of select="$youngestPlayerDOB"/>
        </xsl:element>
    </xsl:template>

    <msxsl:script language="C#" implements-prefix="userCSharp">
        <![CDATA[
        public System.String makeSortableDate(System.String yourDate, string format)
        {
            return (System.DateTime.ParseExact(yourDate, format, System.Globalization.CultureInfo.InvariantCulture).ToString("yyyy-MM-dd"));
        }

        public bool externalfunctionreturningboolean(System.String dobString)
        {
            System.DateTime someDate;
            if (System.DateTime.TryParse(dobString, out someDate))
            {
                // NB : Doesn't work out leap years correctly!
                if ((System.DateTime.Now - someDate).Days < 21 * 365.25)
                {
                    return true;
                }
            }
            return false;
        }
    ]]>
    </msxsl:script>

</xsl:stylesheet>

मैंने फ़ंक्शन पर एक हैक लिया है और अनुमान लगाया है कि पिछली सीमा 21 है। ऊपर दिए गए रिटर्न

<blahhh>true</blahhh>
<blahhh>14-01-1993</blahhh>

मेरा डेटा मॉडल इस प्रकार है:

<Club>
<Captain>
<Name></Name>
<DateOfBirth>15-01-1985</DateOfBirth>
</Captain>
<PlayingStaff>
<Player>
<DateOfBirth>14-01-1993</DateOfBirth>
</Player>
<Player>
<DateOfBirth>07-12-1975</DateOfBirth>
</Player>
<Player>
<DateOfBirth>11-11-1991</DateOfBirth>
</Player>
</PlayingStaff>
</Club>

मैंने यहां दिए गए उत्तर का उपयोग करने की कोशिश की है: XSLT: नवीनतम तिथि प्राप्त करना, लेकिन यह मुझे कोई मूल्य नहीं दे रहा है।

मैं सबसे कम उम्र के खिलाड़ी को एक बाहरी फ़ंक्शन पास करने की कोशिश कर रहा हूं।

मैं इसे बिज्तॉक में कर रहा हूं, इसलिए मुझे एक्सएसएलटी 1 से छुटकारा पाना है

मेरा काम अभी तक निम्नानुसार है:

<xsl:variable name="youngestPlayer">
            <xsl:for-each select="$ClubRoot/*[local-name()='PlayingStaff']/*[local-name()='Player']">
                <xsl:sort select="./*[local-name()='DateOfBirth']" order="descending"/>
                <xsl:if test="position() = 1">
                    <xsl:value-of select="DateOfBirth"/>
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>
        <xsl:variable name="IsYoungestPlayerUnderAgeLimit" select="externalfunctionreturningboolean">
            <xsl:element name="blahhh"><xsl:value-of select="$IsYoungestPlayerUnderAgeLimit"/></xsl:element>
            <xsl:element name="blahhh"><xsl:value-of select="$youngestPlayer"/></xsl:element>

यह एक बड़े टेम्पलेट का हिस्सा है - मैं इसे वास्तव में नहीं बदल सकता, लेकिन ClubRoot का मान है " <xsl:variable name="ClubRoot" select="/*[1]"/>" यह सुनिश्चित करने के लिए कि मैं इसे पढ़ सकता हूं बाल नोड्स

मैं हमेशा मिल रहा हूं

<blahhh>false</blahhh>
<blahhh/> 

मेरे डीबग मानों के रूप में ... इसलिए मैं मूल्य की उम्मीद नहीं कर रहा हूँ जो मुझे उम्मीद है

क्या मुझे कोई गड़बड़ हो गई है?

उपरोक्त डेटा से, मैं अपने सबसे युवा प्लेयर्स चर में 14-01-1993 के मूल्य की अपेक्षा करता हूं। लेकिन इसके रिक्त


समस्या यह है कि XSLT1.0 में वास्तव में तारीखों की अवधारणा नहीं है, इसलिए आप दिनांक- अप-बैरल के तत्वों द्वारा प्रभावी ढंग से सॉर्ट कर रहे हैं जैसे कि वे सिर्फ सामान्य स्ट्रिंग थे। यदि आप यह सुनिश्चित कर सकते हैं कि दिनांक हमेशा डीडी-एमएम-वाई वाई वाई वाई के प्रारूप में आते हैं, तो आप वर्ष, महीने और दिन के आधार पर स्ट्रिंग हेरफेर का उपयोग कर सकते हैं

<xsl:sort select="number(substring(DateOfBirth, 7, 4))" order="descending"/>
<xsl:sort select="number(substring(DateOfBirth, 3, 2))" order="descending"/>
<xsl:sort select="number(substring(DateOfBirth, 1, 2))" order="descending"/>

तो, निम्नलिखित XSLT दिया

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/Club">
      <xsl:for-each select="PlayingStaff/Player">
         <xsl:sort select="number(substring(DateOfBirth, 7, 4))" order="descending"/>
         <xsl:sort select="number(substring(DateOfBirth, 3, 2))" order="descending"/>
         <xsl:sort select="number(substring(DateOfBirth, 1, 2))" order="descending"/>

         <xsl:if test="position() = 1">
            <xsl:value-of select="DateOfBirth"/>
         </xsl:if>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

जब आपके XML पर लागू होता है, तो निम्न आउटपुट होता है

14-01-1993






biztalk