From my xml document, I would like to get the ProtectionOrder number where
1. /Integration/ProtectionOrder/Deleted='false' i.e. <Deleted>false</Deleted>
2. Current status = SBJO or SBJOCOR i.e. <Type Word="SBJO">Signed By Judicial Officer</Type>
3. Where the first status (found on any protectionorder in xml document) has TimestampCreate that is earlier than ControlPoint TimeStamp
Based on my xml document, I should get output for the second ProtectionOrder and not the first one.
The reason being the first ProtectionOrder does not meet my conditions.
The first ProtectionOrder in xml document has <Type Word="SUPERSEDED">Superseded</Type> status so it should be skipped because it does not have status of SBJO or SBJOCOR. Also its
lastest Timestampcreate of 07/14/2016 09:00:25:510 is on status type SUPERSEDED.
The second ProtectionOrder in the xml document is the one I need to show its
protectionOrderNumber and
internalProtectionOrderID. It has <Type Word="SBJO">Signed By Judicial Officer</Type> with latest timestampcreate of 07/14/2016 09:00:25:547
This timestampcreate (<TimestampCreate>07/14/2016 09:00:25:547</TimestampCreate>)is the latest for this Protectionorder and it is less than (it is earlier) than ControlPoint TimeStamp.
To compare controlpoint timestamp to the latest timestampcreate, I have a function in the stylesheet (function formatDateTimeNumeric) to convert the datetime to numeric.
I am using 2 variables vCurrentPoStatus and vControlPointTimestamp
Expected output
Code:
<NotificationEvent notificationType="ProtectionOrderHearing" internalProtectionOrderID="2552" protectionOrderNumber="1600330" hearingDate="07/14/2016" startTime="10:00 AM" settingIntegrationID="25760837" courtName="Carver County" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:mscef="courts.state.mn.us/extfun" xmlns:msxsl="urn:schemas-microsoft-com:xslt">HearingToSend</NotificationEvent>
<NotificationEvent notificationType="ProtectionOrderHearing" internalProtectionOrderID="2552" protectionOrderNumber="1600330" hearingDate="07/14/2016" startTime="2:00 PM" settingIntegrationID="25760838" courtName="Carver County" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:mscef="courts.state.mn.us/extfun" xmlns:msxsl="urn:schemas-microsoft-com:xslt">HearingToSend</NotificationEvent>
xslt code
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:mscef="courts.state.mn.us/extfun" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:if test="Integration/Case/SecurityGroup[not(contains(@Word,'SEAL'))] or not(Integration/Case/SecurityGroup)">
<xsl:call-template name="ProtectionOrder"/>
<xsl:call-template name="ProtectionOrderHearing"/>
</xsl:if>
</xsl:template>
<!-- -->
<xsl:template name="ProtectionOrder">
<xsl:if test="Integration/ControlPoint='SAVE-PROTECTION-ORDER'">
<!-- Check for Update -->
<xsl:if test="Integration/Case/CaseType/@Word='DMA'">
<xsl:variable name="vControlPointTimestamp" select="mscef:formatDateTimeNumeric(string(/Integration/ControlPoint/@Timestamp))"/>
<xsl:for-each select="Integration/ProtectionOrder[Deleted='false']">
<xsl:variable name="vCurrentPoStatus" select="Statuses/Status[(Type/@Word='SBJO') or (Type/@Word='SBJOCOR')][((@Op='A') or (@Op='E'))][mscef:formatDateTimeNumeric(mscef:fixOdysseyTimestamp(string(TimestampCreate))) <=$vControlPointTimestamp][1]/Type/@Word"/>
<xsl:if test="($vCurrentPoStatus ='SBJO') or ($vCurrentPoStatus='SBJOCOR')">
<NotificationEvent notificationType="ProtectionOrder">
<xsl:attribute name="internalProtectionOrderID"><xsl:value-of select="@InternalProtectionOrderID"/></xsl:attribute>
<xsl:attribute name="protectionOrderNumber"><xsl:value-of select="ProtectionOrderNumber"/></xsl:attribute>
<xsl:choose>
<xsl:when test="Type/@Word='SBJOCOR'">Signed By Judicial Officer - Corrected</xsl:when>
<xsl:otherwise>Signed By Judicial Officer</xsl:otherwise>
</xsl:choose>
</NotificationEvent>
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:if>
</xsl:template>
<!-- -->
<xsl:template name="ProtectionOrderHearing">
<xsl:if test="Integration/ControlPoint=('SAVE-FAM-HEARING') or ('SAVE-FAM-HEAR-CTS')">
<xsl:if test="Integration/Case/CaseType/@Word='DMA'">
<xsl:for-each select="Integration/Case">
<xsl:variable name="vFoundActivePO">
<xsl:for-each select="/Integration/ProtectionOrder[Deleted='false']">
<xsl:variable name="vControlPointTimestamp" select="mscef:formatDateTimeNumeric(string(/Integration/ControlPoint/@Timestamp))"/>
<xsl:variable name="vCurrentPoStatus" select="Statuses/Status[mscef:formatDateTimeNumeric(mscef:fixOdysseyTimestamp(string(TimestampCreate))) <=$vControlPointTimestamp][1]/Type/@Word"/>
<xsl:if test="($vCurrentPoStatus ='SBJO') or ($vCurrentPoStatus='SBJOCOR')">HIT</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="vFoundHearingTrigger">
<xsl:choose>
<xsl:when test="count(Hearing[@Op='A'])>0">HIT</xsl:when>
<xsl:when test="count(Hearing[@Op='D'])>0">HIT</xsl:when>
<xsl:when test="count(Hearing[(@Op='E') and (CancelledReason/@Op='E')])>0">HIT</xsl:when>
<xsl:when test="count(Hearing[(@Op='E') and (Setting/HearingDate/@Op='E')])>0">HIT</xsl:when>
<xsl:when test="count(Hearing[(@Op='E') and (Setting/CourtSessionBlock/StartTime/@Op='E')])>0">HIT</xsl:when>
<xsl:when test="count(Hearing/Setting[@Op='A'])>0">HIT</xsl:when>
<xsl:when test="count(Hearing[(@Op='E') and (Setting/RescheduledType/@Op='E')])>0">HIT</xsl:when>
<xsl:when test="count(Hearing[(@Op='E') and (Setting/CancelledReason/@Op='E')])>0">HIT</xsl:when>
<xsl:when test="count(Hearing[(@Op='E') and (Setting/CourtSessionBlock/StartTime/@Op='E')])>0">HIT</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:if test="(contains($vFoundHearingTrigger,'HIT')) and (contains($vFoundActivePO,'HIT'))">
<xsl:choose>
<xsl:when test="count(Hearing/Setting[not(Cancelled)])>0">
<xsl:for-each select="Hearing/Setting[not(Cancelled)]">
<NotificationEvent notificationType="ProtectionOrderHearing">
<xsl:attribute name="internalProtectionOrderID"><xsl:value-of select="//Integration/ProtectionOrder[Deleted='false'][count(Statuses/Status[(Type/@Word='SBJO') or (Type/@Word='SBJOCOR')])>0]/@InternalProtectionOrderID"/></xsl:attribute>
<xsl:attribute name="protectionOrderNumber"><xsl:value-of select="//Integration/ProtectionOrder[Deleted='false'][count(Statuses/Status[(Type/@Word='SBJO') or (Type/@Word='SBJOCOR')])>0]/ProtectionOrderNumber"/></xsl:attribute>
<xsl:attribute name="hearingDate"><xsl:value-of select="HearingDate"/></xsl:attribute>
<xsl:attribute name="startTime"><xsl:value-of select="CourtSessionBlock/StartTime"/></xsl:attribute>
<xsl:attribute name="settingIntegrationID"><xsl:value-of select="@ID"/></xsl:attribute>
<xsl:attribute name="courtName"><xsl:value-of select="../Court/CourtName"/></xsl:attribute>
<xsl:text>HearingToSend</xsl:text>
</NotificationEvent>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<NotificationEvent notificationType="ProtectionOrderHearing">
<xsl:attribute name="internalProtectionOrderID"><xsl:value-of select="//Integration/ProtectionOrder[Deleted='false'][count(Statuses/Status[(Type/@Word='SBJO') or (Type/@Word='SBJOCOR')])>0]/@InternalProtectionOrderID"/></xsl:attribute>
<xsl:attribute name="protectionOrderNumber"><xsl:value-of select="//Integration/ProtectionOrder[Deleted='false'][count(Statuses/Status[(Current='true') and ((Type/@Word='SBJO') or (Type/@Word='SBJOCOR'))])>0]/ProtectionOrderNumber"/><xsl:value-of select="//Integration/ProtectionOrder[Deleted='false'][count(Statuses/Status[(Type/@Word='SBJO') or (Type/@Word='SBJOCOR')])>0]/ProtectionOrderNumber"/></xsl:attribute>
<xsl:text>NoHearings</xsl:text>
</NotificationEvent>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:if>
</xsl:template>
<!-- -->
<msxsl:script language="JScript" implements-prefix="mscef"><![CDATA[
function formatDateTimeNumeric(sDate){
if(sDate.length==0){
return "";
}
else{
var oDate=new Date(sDate);
var str = oDate.getSeconds();
return "" + oDate.getFullYear().toString() + padZeroes(oDate.getMonth() + 1,2) + padZeroes(oDate.getDate(),2) + padZeroes(oDate.getHours().toString(),2) + padZeroes(oDate.getMinutes(),2) + padZeroes(oDate.getSeconds(),2);
}
}
function fixOdysseyTimestamp(sDate){
/* Replace the ":" between seconds and miliseconds */
if(sDate.length==0){
return "";
}
else{
var strParts1 = sDate.split(" ");
var strTime = strParts1[1];
var strParts2 = strTime.split(":");
return strParts1[0] + " " + strParts2[0] + ":" + strParts2[1] + ":" + strParts2[2];
}
}
]]></msxsl:script>
</xsl:stylesheet>
xml document
Code:
<Integration xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:tsg="http://tsgweb.com" xmlns:IXML="http://tsgweb.com" xmlns:CMCodeQueryHelper="urn:CMCodeQueryHelper" PackageID="BCA PO Notification" MessageID="0000" xmlns="">
<ControlPoint Timestamp="7/14/2016 9:00:52 AM" UserID="None">SAVE-FAM-HEARING</ControlPoint>
<Case>
<FiledDate>07/14/2016</FiledDate>
<CaseCategory>FAM</CaseCategory>
<CaseType Word="DMA">Domestic Abuse</CaseType>
<Active>true</Active>
<Deleted>false</Deleted>
<Court>
<NodeID>111</NodeID>
<CourtName>Carver County</CourtName>
<CourtNCIC>MN010015J</CourtNCIC>
</Court>
<Assignment Current="true">
<Court>
<NodeID>111</NodeID>
<CourtName>Carver County</CourtName>
<CourtNCIC>MN010015J</CourtNCIC>
</Court>
<AssignmentDate>07/14/2016</AssignmentDate>
<TimestampCreate>07/14/2016 08:56:32:707</TimestampCreate>
</Assignment>-->
<Hearing ID="175088126" InternalHearingEventID="1734552990">
<HearingType Word="ADJ">Adjudicatory Hearing</HearingType>
<HearingTypeBaseCaseCategory>Criminal</HearingTypeBaseCaseCategory>
<HearingTypeBaseCaseCategory>Family</HearingTypeBaseCaseCategory>
<Court>
<NodeID>111</NodeID>
<CourtName>Carver County</CourtName>
<CourtNCIC>MN010015J</CourtNCIC>
</Court>
<TimestampCreate>07/14/2016 08:58:22:160</TimestampCreate>
<Setting ID="25760837" InternalSettingID="1625564128" Date="07/14/2016">
<HearingDate>07/14/2016</HearingDate>
<StartTime>10:00 AM</StartTime>
<EndTime>11:00 AM</EndTime>
<CourtSessionName>Ad-Hoc_10-FA-16-40</CourtSessionName>
<CourtSessionID ID="3862219" InternalCourtSessionID="1612936893"/>
<Calendar Word="10GEN">New General Carver</Calendar>
<CalendarBaseCaseCategory>Criminal</CalendarBaseCaseCategory>
<CalendarBaseCaseCategory>Civil</CalendarBaseCaseCategory>
<CalendarBaseCaseCategory>Family</CalendarBaseCaseCategory>
<CalendarBaseCaseCategory>Probate or Mental Health</CalendarBaseCaseCategory>
<CourtSessionBlock InternalCourtSessionBlockID="1615773709">
<StartTime>10:00 AM</StartTime>
<EndTime>11:00 AM</EndTime>
</CourtSessionBlock>
<InterpreterNeeded>false</InterpreterNeeded>
<TimestampCreate>07/14/2016 08:58:23:240</TimestampCreate>
</Setting>
</Hearing>
<Hearing ID="175088128" InternalHearingEventID="1734552992" Op="A">
<HearingType Op="A" Word="OFP">Order for Protection Hearing</HearingType>
<HearingTypeBaseCaseCategory>Family</HearingTypeBaseCaseCategory>
<TimestampCreate Op="A">07/14/2016 09:00:52:680</TimestampCreate>
<Setting ID="25760838" InternalSettingID="1625564129" Date="07/14/2016" Op="A">
<HearingDate Op="A">07/14/2016</HearingDate>
<StartTime Op="A">2:00 PM</StartTime>
<EndTime Op="A">3:00 PM</EndTime>
<CourtSessionName>Ad-Hoc_10-FA-16-40</CourtSessionName>
<CourtSessionID Op="A" ID="3862221" InternalCourtSessionID="1612936894"/>
<Calendar Op="A" Word="10GEN">New General Carver</Calendar>
<CalendarBaseCaseCategory>Criminal</CalendarBaseCaseCategory>
<CalendarBaseCaseCategory>Civil</CalendarBaseCaseCategory>
<CalendarBaseCaseCategory>Family</CalendarBaseCaseCategory>
<CalendarBaseCaseCategory>Probate or Mental Health</CalendarBaseCaseCategory>
<CourtResource Op="A">
<Type Op="A" Word="JUD">Judicial Officer</Type>
<Code Op="A" Word="00727G">Abrams, Jerome B.</Code>
</CourtResource>
<CourtSessionBlock InternalCourtSessionBlockID="1615773710">
<StartTime Op="A">2:00 PM</StartTime>
<EndTime Op="A">3:00 PM</EndTime>
</CourtSessionBlock>
<InterpreterNeeded Op="A">false</InterpreterNeeded>
<TimestampCreate Op="A">07/14/2016 09:00:52:767</TimestampCreate>
</Setting>
</Hearing>
</Case>
<ProtectionOrder InternalProtectionOrderID="2551" xmlns:user="http://tylertechnologies.com">
<Deleted>false</Deleted>
<RespondentPartyID InternalPartyID="1614099130">1614099130</RespondentPartyID>
<RespondentNameID InternalNameID="1614846290">1614846290</RespondentNameID>
<ProtectionOrderNumber>1600329</ProtectionOrderNumber>
<Issued>07/14/2016</Issued>
<Expiration>10/22/2016</Expiration>
<Type Word="EXPARTE">Ex Parte Order for Protection</Type>
<Statuses>
<Status>
<Current>true</Current>
<Active>No</Active>
<Date>07/14/2016</Date>
<Type Word="SUPERSEDED">Superseded</Type>
<TimestampCreate>07/14/2016 09:00:25:510</TimestampCreate>
</Status>
<Status>
<Current>false</Current>
<Active>Yes</Active>
<Date>07/14/2016</Date>
<Type Word="SBJO">Signed By Judicial Officer</Type>
<TimestampCreate>07/14/2016 08:57:54:797</TimestampCreate>
</Status>
<Status>
<Current>false</Current>
<Active>No</Active>
<Date>07/14/2016</Date>
<Type Word="DRAFT">Draft</Type>
<TimestampCreate>07/14/2016 08:57:39:983</TimestampCreate>
</Status>
</Statuses>
</ProtectionOrder>
<ProtectionOrder InternalProtectionOrderID="2552" xmlns:user="http://tylertechnologies.com">
<Deleted>false</Deleted>
<ProtectionOrderNumber>1600330</ProtectionOrderNumber>
<Type Word="EXPARTE">Ex Parte Order for Protection</Type>
<Statuses>
<Status>
<Current>true</Current>
<Active>Yes</Active>
<Date>07/14/2016</Date>
<Type Word="SBJO">Signed By Judicial Officer</Type>
<TimestampCreate>07/14/2016 09:00:25:547</TimestampCreate>
</Status>
<Status>
<Current>false</Current>
<Active>No</Active>
<Date>07/14/2016</Date>
<Type Word="DRAFT">Draft</Type>
<TimestampCreate>07/14/2016 09:00:14:380</TimestampCreate>
</Status>
</Statuses>
</ProtectionOrder>
</Integration>