| 438 | | SET xslt = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n\r\n<!--\r\nOpenMRS FormEntry Form HL7 Translation\r\n\r\nThis XSLT is used to translate OpenMRS forms from XML into HL7 2.5 format\r\n\r\n@author Burke Mamlin, MD\r\n@author Ben Wolfe\r\n@version 1.9.5\r\n\r\n1.9.5 - allow for organizing sections under \"obs\" section\r\n1.9.4 - add support for message uid (as HL7 control id) and transform of patient.health_center to Discharge to Location (PV1-37)\r\n1.9.3 - fixed rounding error on timestamp (tenths of seconds getting rounded up, causing \"60\" seconds in some cases) \r\n1.9.2 - first generally useful version\r\n-->\r\n\r\n<xsl:stylesheet version=\"2.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:xdt=\"http://www.w3.org/2005/xpath-datatypes\">\r\n <xsl:output method=\"text\" version=\"1.0\" encoding=\"UTF-8\" indent=\"no\"/>\r\n\r\n<xsl:variable name=\"SENDING-APPLICATION\">FORMENTRY</xsl:variable>\r\n<xsl:variable name=\"SENDING-FACILITY\">AMRS.ELD</xsl:variable>\r\n<xsl:variable name=\"RECEIVING-APPLICATION\">HL7LISTENER</xsl:variable>\r\n<xsl:variable name=\"RECEIVING-FACILITY\">AMRS.ELD</xsl:variable>\r\n<xsl:variable name=\"PATIENT-AUTHORITY\"></xsl:variable> <!-- leave blank for internal id, max 20 characters -->\r\n <!-- for now, must match patient_identifier_type.name -->\r\n<xsl:variable name=\"FORM-AUTHORITY\">AMRS.ELD.FORMID</xsl:variable> <!-- max 20 characters -->\r\n\r\n<xsl:template match=\"/\">\r\n <xsl:apply-templates />\r\n</xsl:template>\r\n\r\n<!-- Form template -->\r\n<xsl:template match=\"form\">\r\n <!-- MSH Header -->\r\n <xsl:text>MSH|^~\\&</xsl:text> <!-- Message header, personAttributeType separator, and encoding characters -->\r\n <xsl:text>|</xsl:text> <!-- MSH-3 Sending application -->\r\n <xsl:value-of select=\"$SENDING-APPLICATION\" />\r\n <xsl:text>|</xsl:text> <!-- MSH-4 Sending facility -->\r\n <xsl:value-of select=\"$SENDING-FACILITY\" />\r\n <xsl:text>|</xsl:text> <!-- MSH-5 Receiving application -->\r\n <xsl:value-of select=\"$RECEIVING-APPLICATION\" />\r\n <xsl:text>|</xsl:text> <!-- MSH-6 Receiving facility -->\r\n <xsl:value-of select=\"$RECEIVING-FACILITY\" />\r\n <xsl:text>|</xsl:text> <!-- MSH-7 Date/time message sent -->\r\n <xsl:call-template name=\"hl7Timestamp\">\r\n <xsl:with-param name=\"date\" select=\"current-dateTime()\" />\r\n </xsl:call-template>\r\n <xsl:text>|</xsl:text> <!-- MSH-8 Security -->\r\n <xsl:text>|ORU^R01</xsl:text> <!-- MSH-9 Message type ^ Event type (observation report unsolicited) -->\r\n <xsl:text>|</xsl:text> <!-- MSH-10 Message control ID -->\r\n <xsl:choose>\r\n <xsl:when test=\"header/uid\">\r\n <xsl:value-of select=\"header/uid\" />\r\n </xsl:when>\r\n <xsl:otherwise>\r\n <xsl:value-of select=\"patient/patient.patient_id\" />\r\n <xsl:call-template name=\"hl7Timestamp\">\r\n <xsl:with-param name=\"date\" select=\"current-dateTime()\" />\r\n </xsl:call-template>\r\n </xsl:otherwise>\r\n </xsl:choose>\r\n <xsl:text>|P</xsl:text> <!-- MSH-11 Processing ID -->\r\n <xsl:text>|2.5</xsl:text> <!-- MSH-12 HL7 version -->\r\n <xsl:text>|1</xsl:text> <!-- MSH-13 Message sequence number -->\r\n <xsl:text>|</xsl:text> <!-- MSH-14 Continuation Pointer -->\r\n <xsl:text>|</xsl:text> <!-- MSH-15 Accept Acknowledgement Type -->\r\n <xsl:text>|</xsl:text> <!-- MSH-16 Application Acknowledgement Type -->\r\n <xsl:text>|</xsl:text> <!-- MSH-17 Country Code -->\r\n <xsl:text>|</xsl:text> <!-- MSH-18 Character Set -->\r\n <xsl:text>|</xsl:text> <!-- MSH-19 Principal Language of Message -->\r\n <xsl:text>|</xsl:text> <!-- MSH-20 Alternate Character Set Handling Scheme -->\r\n <xsl:text>|</xsl:text> <!-- MSH-21 Message Profile Identifier -->\r\n <xsl:value-of select=\"@id\" />\r\n <xsl:text>^</xsl:text>\r\n <xsl:value-of select=\"$FORM-AUTHORITY\" />\r\n <xsl:text>
</xsl:text>\r\n\r\n <!-- PID header -->\r\n <xsl:text>PID</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- PID-1 Set ID -->\r\n <xsl:text>|</xsl:text> <!-- PID-2 (deprecated) Patient ID -->\r\n <xsl:text>|</xsl:text> <!-- PID-3 Patient Identifier List -->\r\n <xsl:call-template name=\"patient_id\">\r\n <xsl:with-param name=\"pid\" select=\"patient/patient.patient_id\" />\r\n <xsl:with-param name=\"auth\" select=\"$PATIENT-AUTHORITY\" />\r\n <xsl:with-param name=\"type\" select=\"L\" />\r\n </xsl:call-template>\r\n <xsl:if test=\"patient/patient.previous_mrn and string-length(patient/patient.previous_mrn) > 0\">\r\n <xsl:text>~</xsl:text>\r\n <xsl:call-template name=\"patient_id\">\r\n <xsl:with-param name=\"pid\" select=\"patient/patient.previous_mrn\" />\r\n <xsl:with-param name=\"auth\" select=\"$PATIENT-AUTHORITY\" />\r\n <xsl:with-param name=\"type\" select=\"PRIOR\" />\r\n </xsl:call-template>\r\n </xsl:if>\r\n <!-- Additional patient identifiers -->\r\n <!-- This example is for an MTCT-PLUS identifier used in the AMPATH project in Kenya (skipped if not present) -->\r\n <xsl:if test=\"patient/patient.mtctplus_id and string-length(patient/patient.mtctplus_id) > 0\">\r\n <xsl:text>~</xsl:text>\r\n <xsl:call-template name=\"patient_id\">\r\n <xsl:with-param name=\"pid\" select=\"patient/patient.mtctplus_id\" />\r\n <xsl:with-param name=\"auth\" select=\"$PATIENT-AUTHORITY\" />\r\n <xsl:with-param name=\"type\" select=\"MTCTPLUS\" />\r\n </xsl:call-template>\r\n </xsl:if>\r\n <xsl:text>|</xsl:text> <!-- PID-4 (deprecated) Alternate patient ID -->\r\n <!-- PID-5 Patient name -->\r\n <xsl:text>|</xsl:text> <!-- Family name -->\r\n <xsl:value-of select=\"patient/patient.family_name\" />\r\n <xsl:text>^</xsl:text> <!-- Given name -->\r\n <xsl:value-of select=\"patient/patient.given_name\" />\r\n <xsl:text>^</xsl:text> <!-- Middle name -->\r\n <xsl:value-of select=\"patient/patient.middle_name\" />\r\n <xsl:text>|</xsl:text> <!-- PID-6 Mother\'s maiden name -->\r\n <xsl:text>|</xsl:text> <!-- PID-7 Date/Time of Birth -->\r\n <xsl:value-of select=\"patient/patient.date_of_birth\" />\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n \r\n <!-- PV1 header -->\r\n <xsl:text>PV1</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- PV1-1 Sub ID -->\r\n <xsl:text>|O</xsl:text> <!-- PV1-2 Patient class (O = outpatient) -->\r\n <xsl:text>|</xsl:text> <!-- PV1-3 Patient location -->\r\n <xsl:value-of select=\"encounter/encounter.location_id\" />\r\n <xsl:text>|</xsl:text> <!-- PV1-4 Admission type (2 = return) -->\r\n <xsl:text>|</xsl:text> <!-- PV1-5 Pre-Admin Number -->\r\n <xsl:text>|</xsl:text> <!-- PV1-6 Prior Patient Location -->\r\n <xsl:text>|</xsl:text> <!-- PV1-7 Attending Doctor -->\r\n <xsl:value-of select=\"encounter/encounter.provider_id\" />\r\n <xsl:text>|</xsl:text> <!-- PV1-8 Referring Doctor -->\r\n <xsl:text>|</xsl:text> <!-- PV1-9 Consulting Doctor -->\r\n <xsl:text>|</xsl:text> <!-- PV1-10 Hospital Service -->\r\n <xsl:text>|</xsl:text> <!-- PV1-11 Temporary Location -->\r\n <xsl:text>|</xsl:text> <!-- PV1-12 Preadmin Test Indicator -->\r\n <xsl:text>|</xsl:text> <!-- PV1-13 Re-adminssion Indicator -->\r\n <xsl:text>|</xsl:text> <!-- PV1-14 Admit Source -->\r\n <xsl:text>|</xsl:text> <!-- PV1-15 Ambulatory Status -->\r\n <xsl:text>|</xsl:text> <!-- PV1-16 VIP Indicator -->\r\n <xsl:text>|</xsl:text> <!-- PV1-17 Admitting Doctor -->\r\n <xsl:text>|</xsl:text> <!-- PV1-18 Patient Type -->\r\n <xsl:text>|</xsl:text> <!-- PV1-19 Visit Number -->\r\n <xsl:text>|</xsl:text> <!-- PV1-20 Financial Class -->\r\n <xsl:text>|</xsl:text> <!-- PV1-21 Charge Price Indicator -->\r\n <xsl:text>|</xsl:text> <!-- PV1-22 Courtesy Code -->\r\n <xsl:text>|</xsl:text> <!-- PV1-23 Credit Rating -->\r\n <xsl:text>|</xsl:text> <!-- PV1-24 Contract Code -->\r\n <xsl:text>|</xsl:text> <!-- PV1-25 Contract Effective Date -->\r\n <xsl:text>|</xsl:text> <!-- PV1-26 Contract Amount -->\r\n <xsl:text>|</xsl:text> <!-- PV1-27 Contract Period -->\r\n <xsl:text>|</xsl:text> <!-- PV1-28 Interest Code -->\r\n <xsl:text>|</xsl:text> <!-- PV1-29 Transfer to Bad Debt Code -->\r\n <xsl:text>|</xsl:text> <!-- PV1-30 Transfer to Bad Debt Date -->\r\n <xsl:text>|</xsl:text> <!-- PV1-31 Bad Debt Agency Code -->\r\n <xsl:text>|</xsl:text> <!-- PV1-31 Bad Debt Transfer Amount -->\r\n <xsl:text>|</xsl:text> <!-- PV1-33 Bad Debt Recovery Amount -->\r\n <xsl:text>|</xsl:text> <!-- PV1-34 Delete Account Indicator -->\r\n <xsl:text>|</xsl:text> <!-- PV1-35 Delete Account Date -->\r\n <xsl:text>|</xsl:text> <!-- PV1-36 Discharge Disposition -->\r\n <xsl:text>|</xsl:text> <!-- PV1-37 Discharge To Location -->\r\n <xsl:if test=\"patient/patient.health_center\">\r\n <xsl:value-of select=\"replace(patient/patient.health_center,\'\\^\',\'&\')\" />\r\n </xsl:if>\r\n <xsl:text>|</xsl:text> <!-- PV1-38 Diet Type -->\r\n <xsl:text>|</xsl:text> <!-- PV1-39 Servicing Facility -->\r\n <xsl:text>|</xsl:text> <!-- PV1-40 Bed Status -->\r\n <xsl:text>|</xsl:text> <!-- PV1-41 Account Status -->\r\n <xsl:text>|</xsl:text> <!-- PV1-42 Pending Location -->\r\n <xsl:text>|</xsl:text> <!-- PV1-43 Prior Temporary Location -->\r\n <xsl:text>|</xsl:text> <!-- PV1-44 Admit Date/Time -->\r\n <xsl:call-template name=\"hl7Date\">\r\n <xsl:with-param name=\"date\" select=\"encounter/encounter.encounter_datetime\" />\r\n </xsl:call-template>\r\n <xsl:text>|</xsl:text> <!-- PV1-45 Discharge Date/Time -->\r\n <xsl:text>|</xsl:text> <!-- PV1-46 Current Patient Balance -->\r\n <xsl:text>|</xsl:text> <!-- PV1-47 Total Charges -->\r\n <xsl:text>|</xsl:text> <!-- PV1-48 Total Adjustments -->\r\n <xsl:text>|</xsl:text> <!-- PV1-49 Total Payments -->\r\n <xsl:text>|</xsl:text> <!-- PV1-50 Alternate Visit ID -->\r\n <xsl:text>|V</xsl:text> <!-- PV1-51 Visit Indicator -->\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n\r\n <!-- We use encounter date as the timestamp for each observation -->\r\n <xsl:variable name=\"encounterTimestamp\">\r\n <xsl:call-template name=\"hl7Date\">\r\n <xsl:with-param name=\"date\" select=\"encounter/encounter.encounter_datetime\" />\r\n </xsl:call-template>\r\n </xsl:variable>\r\n \r\n <!-- ORC Common Order Segment -->\r\n <xsl:text>ORC</xsl:text> <!-- Message type -->\r\n <xsl:text>|RE</xsl:text> <!-- ORC-1 Order Control (RE = obs to follow) -->\r\n <xsl:text>|</xsl:text> <!-- ORC-2 Placer Order Number -->\r\n <xsl:text>|</xsl:text> <!-- ORC-3 Filler Order Number -->\r\n <xsl:text>|</xsl:text> <!-- ORC-4 Placer Group Number -->\r\n <xsl:text>|</xsl:text> <!-- ORC-5 Order Status -->\r\n <xsl:text>|</xsl:text> <!-- ORC-6 Response Flag -->\r\n <xsl:text>|</xsl:text> <!-- ORC-7 Quantity/Timing -->\r\n <xsl:text>|</xsl:text> <!-- ORC-8 Parent -->\r\n <xsl:text>|</xsl:text> <!-- ORC-9 Date/Time of Transaction -->\r\n <xsl:call-template name=\"hl7Timestamp\">\r\n <xsl:with-param name=\"date\" select=\"xs:dateTime(header/date_entered)\" />\r\n </xsl:call-template>\r\n <xsl:text>|</xsl:text> <!-- ORC-10 Entered By -->\r\n <xsl:value-of select=\"header/enterer\" />\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n\r\n <!-- Observation(s) -->\r\n <!-- <xsl:variable name=\"obsList\" select=\"obs/*[(@openmrs_concept and value and value/text() != \'\') or *[@openmrs_concept and text()=\'true\']]\" /> -->\r\n <xsl:variable name=\"obsList\" select=\"obs/*[(@openmrs_concept and value and value/text() != \'\') or *[@openmrs_concept and text()=\'true\']]|obs/*[not(@openmrs_concept)]/*[(@openmrs_concept and value and value/text() != \'\') or *[@openmrs_concept and text()=\'true\']]\" />\r\n <xsl:variable name=\"obsListCount\" select=\"count($obsList)\" as=\"xs:integer\" />\r\n <!-- Observation OBR -->\r\n <xsl:text>OBR</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- OBR-1 Set ID -->\r\n <xsl:text>1</xsl:text>\r\n <xsl:text>|</xsl:text> <!-- OBR-2 Placer order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-3 Filler order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-4 OBR concept -->\r\n <xsl:value-of select=\"obs/@openmrs_concept\" />\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n\r\n <!-- observation OBXs -->\r\n <xsl:for-each select=\"$obsList\">\r\n <xsl:choose>\r\n <xsl:when test=\"value\">\r\n <xsl:call-template name=\"obsObx\">\r\n <xsl:with-param name=\"setId\" select=\"position()\" />\r\n <xsl:with-param name=\"datatype\" select=\"@openmrs_datatype\" />\r\n <xsl:with-param name=\"units\" select=\"@openmrs_units\" />\r\n <xsl:with-param name=\"concept\" select=\"@openmrs_concept\" />\r\n <xsl:with-param name=\"date\" select=\"date/text()\" />\r\n <xsl:with-param name=\"time\" select=\"time/text()\" />\r\n <xsl:with-param name=\"value\" select=\"value\" />\r\n <xsl:with-param name=\"encounterTimestamp\" select=\"$encounterTimestamp\" />\r\n </xsl:call-template>\r\n </xsl:when>\r\n <xsl:otherwise>\r\n <xsl:variable name=\"setId\" select=\"position()\" />\r\n <xsl:for-each select=\"*[@openmrs_concept and text() = \'true\']\">\r\n <xsl:call-template name=\"obsObx\">\r\n <xsl:with-param name=\"setId\" select=\"$setId\" />\r\n <xsl:with-param name=\"subId\" select=\"concat($setId,position())\" />\r\n <xsl:with-param name=\"datatype\" select=\"../@openmrs_datatype\" />\r\n <xsl:with-param name=\"units\" select=\"../@openmrs_units\" />\r\n <xsl:with-param name=\"concept\" select=\"../@openmrs_concept\" />\r\n <xsl:with-param name=\"date\" select=\"../date/text()\" />\r\n <xsl:with-param name=\"time\" select=\"../time/text()\" />\r\n <xsl:with-param name=\"value\" select=\"@openmrs_concept\" />\r\n <xsl:with-param name=\"encounterTimestamp\" select=\"$encounterTimestamp\" />\r\n </xsl:call-template>\r\n </xsl:for-each>\r\n </xsl:otherwise>\r\n </xsl:choose>\r\n </xsl:for-each>\r\n \r\n <!-- Grouped observation(s) -->\r\n <!-- <xsl:variable name=\"obsGroupList\" select=\"obs/*[@openmrs_concept and not(date) and *[(@openmrs_concept and value and value/text() != \'\') or *[@openmrs_concept and text()=\'true\']]]\" /> -->\r\n <xsl:variable name=\"obsGroupList\" select=\"obs/*[@openmrs_concept and not(date) and *[(@openmrs_concept and value and value/text() != \'\') or *[@openmrs_concept and text()=\'true\']]]|obs/*[not(@openmrs_concept)]/*[@openmrs_concept and not(date) and *[(@openmrs_concept and value and value/text() != \'\') or *[@openmrs_concept and text()=\'true\']]]\" />\r\n <xsl:variable name=\"obsGroupListCount\" select=\"count($obsGroupList)\" as=\"xs:integer\" />\r\n <xsl:for-each select=\"$obsGroupList\">\r\n <!-- Observation OBR -->\r\n <xsl:text>OBR</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- OBR-1 Set ID -->\r\n <xsl:value-of select=\"$obsListCount + position()\" />\r\n <xsl:text>|</xsl:text> <!-- OBR-2 Placer order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-3 Filler order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-4 OBR concept -->\r\n <xsl:value-of select=\"@openmrs_concept\" />\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n \r\n <!-- Generate OBXs -->\r\n <xsl:for-each select=\"*[(@openmrs_concept and value and value/text() != \'\') or *[@openmrs_concept and text()=\'true\']]\">\r\n <xsl:choose>\r\n <xsl:when test=\"value\">\r\n <xsl:call-template name=\"obsObx\">\r\n <xsl:with-param name=\"setId\" select=\"position()\" />\r\n <xsl:with-param name=\"subId\" select=\"1\" />\r\n <xsl:with-param name=\"datatype\" select=\"@openmrs_datatype\" />\r\n <xsl:with-param name=\"units\" select=\"@openmrs_units\" />\r\n <xsl:with-param name=\"concept\" select=\"@openmrs_concept\" />\r\n <xsl:with-param name=\"date\" select=\"date/text()\" />\r\n <xsl:with-param name=\"time\" select=\"time/text()\" />\r\n <xsl:with-param name=\"value\" select=\"value\" />\r\n <xsl:with-param name=\"encounterTimestamp\" select=\"$encounterTimestamp\" />\r\n </xsl:call-template>\r\n </xsl:when>\r\n <xsl:otherwise>\r\n <xsl:variable name=\"setId\" select=\"position()\" />\r\n <xsl:for-each select=\"*[@openmrs_concept and text() = \'true\']\">\r\n <xsl:call-template name=\"obsObx\">\r\n <xsl:with-param name=\"setId\" select=\"$setId\" />\r\n <xsl:with-param name=\"subId\" select=\"concat(\'1.\',position())\" />\r\n <xsl:with-param name=\"datatype\" select=\"../@openmrs_datatype\" />\r\n <xsl:with-param name=\"units\" select=\"../@openmrs_units\" />\r\n <xsl:with-param name=\"concept\" select=\"../@openmrs_concept\" />\r\n <xsl:with-param name=\"date\" select=\"../date/text()\" />\r\n <xsl:with-param name=\"time\" select=\"../time/text()\" />\r\n <xsl:with-param name=\"value\" select=\"@openmrs_concept\" />\r\n <xsl:with-param name=\"encounterTimestamp\" select=\"$encounterTimestamp\" />\r\n </xsl:call-template>\r\n </xsl:for-each>\r\n </xsl:otherwise>\r\n </xsl:choose>\r\n </xsl:for-each>\r\n </xsl:for-each>\r\n\r\n <!-- Problem list(s) -->\r\n <xsl:variable name=\"problemList\" select=\"problem_list/*[value[text() != \'\']]\" />\r\n <xsl:variable name=\"problemListCount\" select=\"count($problemList)\" as=\"xs:integer\" />\r\n <xsl:if test=\"$problemList\">\r\n <!-- Problem list OBR -->\r\n <xsl:text>OBR</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- OBR-1 Set ID -->\r\n <xsl:value-of select=\"$obsListCount + $obsGroupListCount + 1\" />\r\n <xsl:text>|</xsl:text> <!-- OBR-2 Placer order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-3 Filler order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-4 OBR concept -->\r\n <xsl:value-of select=\"problem_list/@openmrs_concept\" />\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n\r\n <!-- Problem list OBXs -->\r\n <xsl:for-each select=\"$problemList\">\r\n <xsl:call-template name=\"obsObx\">\r\n <xsl:with-param name=\"setId\" select=\"position()\" />\r\n <xsl:with-param name=\"datatype\" select=\"\'CWE\'\" />\r\n <xsl:with-param name=\"concept\" select=\"@openmrs_concept\" />\r\n <xsl:with-param name=\"date\" select=\"date/text()\" />\r\n <xsl:with-param name=\"time\" select=\"time/text()\" />\r\n <xsl:with-param name=\"value\" select=\"value\" />\r\n <xsl:with-param name=\"encounterTimestamp\" select=\"$encounterTimestamp\" />\r\n </xsl:call-template> \r\n </xsl:for-each>\r\n </xsl:if>\r\n \r\n <!-- Orders -->\r\n <xsl:variable name=\"orderList\" select=\"orders/*[*[@openmrs_concept and ((value and value/text() != \'\') or *[@openmrs_concept and text() = \'true\'])]]\" />\r\n <xsl:variable name=\"orderListCount\" select=\"count($orderList)\" as=\"xs:integer\" />\r\n <xsl:for-each select=\"$orderList\">\r\n <!-- Order section OBR -->\r\n <xsl:text>OBR</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- OBR-1 Set ID -->\r\n <xsl:value-of select=\"$obsListCount + $obsGroupListCount + $problemListCount + 1\" />\r\n <xsl:text>|</xsl:text> <!-- OBR-2 Placer order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-3 Filler order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-4 OBR concept -->\r\n <xsl:value-of select=\"@openmrs_concept\" />\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n \r\n <!-- Order OBXs -->\r\n <xsl:for-each select=\"*[@openmrs_concept and ((value and value/text() != \'\') or *[@openmrs_concept and text() = \'true\'])]\">\r\n <xsl:choose>\r\n <xsl:when test=\"value\">\r\n <xsl:call-template name=\"obsObx\">\r\n <xsl:with-param name=\"setId\" select=\"position()\" />\r\n <xsl:with-param name=\"datatype\" select=\"@openmrs_datatype\" />\r\n <xsl:with-param name=\"units\" select=\"@openmrs_units\" />\r\n <xsl:with-param name=\"concept\" select=\"@openmrs_concept\" />\r\n <xsl:with-param name=\"date\" select=\"date/text()\" />\r\n <xsl:with-param name=\"time\" select=\"time/text()\" />\r\n <xsl:with-param name=\"value\" select=\"value\" />\r\n <xsl:with-param name=\"encounterTimestamp\" select=\"$encounterTimestamp\" />\r\n </xsl:call-template>\r\n </xsl:when>\r\n <xsl:otherwise>\r\n <xsl:variable name=\"setId\" select=\"position()\" />\r\n <xsl:for-each select=\"*[@openmrs_concept and text() = \'true\']\">\r\n <xsl:call-template name=\"obsObx\">\r\n <xsl:with-param name=\"setId\" select=\"$setId\" />\r\n <xsl:with-param name=\"subId\" select=\"position()\" />\r\n <xsl:with-param name=\"datatype\" select=\"../@openmrs_datatype\" />\r\n <xsl:with-param name=\"units\" select=\"../@openmrs_units\" />\r\n <xsl:with-param name=\"concept\" select=\"../@openmrs_concept\" />\r\n <xsl:with-param name=\"date\" select=\"../date/text()\" />\r\n <xsl:with-param name=\"time\" select=\"../time/text()\" />\r\n <xsl:with-param name=\"value\" select=\"@openmrs_concept\" />\r\n <xsl:with-param name=\"encounterTimestamp\" select=\"$encounterTimestamp\" />\r\n </xsl:call-template>\r\n </xsl:for-each>\r\n </xsl:otherwise>\r\n </xsl:choose>\r\n </xsl:for-each> \r\n </xsl:for-each>\r\n \r\n</xsl:template>\r\n\r\n<!-- Patient Identifier (CX) generator -->\r\n<xsl:template name=\"patient_id\">\r\n <xsl:param name=\"pid\" />\r\n <xsl:param name=\"auth\" />\r\n <xsl:param name=\"type\" />\r\n <xsl:value-of select=\"$pid\" />\r\n <xsl:text>^</xsl:text> <!-- Check digit -->\r\n <xsl:text>^</xsl:text> <!-- Check Digit Scheme -->\r\n <xsl:text>^</xsl:text> <!-- Assigning Authority -->\r\n <xsl:value-of select=\"$auth\" />\r\n <xsl:text>^</xsl:text> <!-- Identifier Type -->\r\n <xsl:value-of select=\"$type\" />\r\n</xsl:template>\r\n\r\n<!-- OBX Generator -->\r\n<xsl:template name=\"obsObx\">\r\n <xsl:param name=\"setId\" required=\"no\"></xsl:param>\r\n <xsl:param name=\"subId\" required=\"no\"></xsl:param>\r\n <xsl:param name=\"datatype\" required=\"yes\" />\r\n <xsl:param name=\"concept\" required=\"yes\" />\r\n <xsl:param name=\"date\" required=\"no\"></xsl:param>\r\n <xsl:param name=\"time\" required=\"no\"></xsl:param>\r\n <xsl:param name=\"value\" required=\"no\"></xsl:param>\r\n <xsl:param name=\"units\" required=\"no\"></xsl:param>\r\n <xsl:param name=\"encounterTimestamp\" required=\"yes\" />\r\n <xsl:text>OBX</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- Set ID -->\r\n <xsl:value-of select=\"$setId\" />\r\n <xsl:text>|</xsl:text> <!-- Observation datatype -->\r\n <xsl:choose>\r\n <xsl:when test=\"$datatype = \'BIT\'\">\r\n <xsl:text>NM</xsl:text>\r\n </xsl:when>\r\n <xsl:otherwise>\r\n <xsl:value-of select=\"$datatype\" />\r\n </xsl:otherwise>\r\n </xsl:choose>\r\n <xsl:text>|</xsl:text> <!-- Concept (what was observed -->\r\n <xsl:value-of select=\"$concept\" />\r\n <xsl:text>|</xsl:text> <!-- Sub-ID -->\r\n <xsl:value-of select=\"$subId\" />\r\n <xsl:text>|</xsl:text> <!-- Value -->\r\n <xsl:choose>\r\n <xsl:when test=\"$datatype = \'TS\'\">\r\n <xsl:call-template name=\"hl7Timestamp\">\r\n <xsl:with-param name=\"date\" select=\"$value\" />\r\n </xsl:call-template>\r\n </xsl:when>\r\n <xsl:when test=\"$datatype = \'DT\'\">\r\n <xsl:call-template name=\"hl7Date\">\r\n <xsl:with-param name=\"date\" select=\"$value\" />\r\n </xsl:call-template>\r\n </xsl:when>\r\n <xsl:when test=\"$datatype = \'TM\'\">\r\n <xsl:call-template name=\"hl7Time\">\r\n <xsl:with-param name=\"time\" select=\"$value\" />\r\n </xsl:call-template>\r\n </xsl:when>\r\n <xsl:when test=\"$datatype = \'BIT\'\">\r\n <xsl:choose>\r\n <xsl:when test=\"$value = \'0\' or upper-case($value) = \'FALSE\'\">0</xsl:when>\r\n <xsl:otherwise>1</xsl:otherwise>\r\n </xsl:choose>\r\n </xsl:when>\r\n <xsl:otherwise>\r\n <xsl:value-of select=\"$value\" />\r\n </xsl:otherwise>\r\n </xsl:choose>\r\n <xsl:text>|</xsl:text> <!-- Units -->\r\n <xsl:value-of select=\"$units\" />\r\n <xsl:text>|</xsl:text> <!-- Reference range -->\r\n <xsl:text>|</xsl:text> <!-- Abnormal flags -->\r\n <xsl:text>|</xsl:text> <!-- Probability -->\r\n <xsl:text>|</xsl:text> <!-- Nature of abnormal test -->\r\n <xsl:text>|</xsl:text> <!-- Observation result status -->\r\n <xsl:text>|</xsl:text> <!-- Effective date -->\r\n <xsl:text>|</xsl:text> <!-- User defined access checks -->\r\n <xsl:text>|</xsl:text> <!-- Date time of observation -->\r\n <xsl:choose>\r\n <xsl:when test=\"$date and $time\">\r\n <xsl:call-template name=\"hl7Timestamp\">\r\n <xsl:with-param name=\"date\" select=\"dateTime($date,$time)\" />\r\n </xsl:call-template>\r\n </xsl:when>\r\n <xsl:when test=\"$date\">\r\n <xsl:call-template name=\"hl7Date\">\r\n <xsl:with-param name=\"date\" select=\"$date\" />\r\n </xsl:call-template>\r\n </xsl:when>\r\n <xsl:otherwise>\r\n <xsl:value-of select=\"$encounterTimestamp\" />\r\n </xsl:otherwise>\r\n </xsl:choose>\r\n <xsl:text>
</xsl:text>\r\n</xsl:template>\r\n\r\n<!-- Generate HL7-formatted timestamp -->\r\n<xsl:template name=\"hl7Timestamp\">\r\n <xsl:param name=\"date\" />\r\n <xsl:if test=\"string($date) != \'\'\">\r\n <xsl:value-of select=\"concat(year-from-dateTime($date),format-number(month-from-dateTime($date),\'00\'),format-number(day-from-dateTime($date),\'00\'),format-number(hours-from-dateTime($date),\'00\'),format-number(minutes-from-dateTime($date),\'00\'),format-number(floor(seconds-from-dateTime($date)),\'00\'))\" />\r\n </xsl:if>\r\n</xsl:template>\r\n\r\n<!-- Generate HL7-formatted date -->\r\n<xsl:template name=\"hl7Date\">\r\n <xsl:param name=\"date\" />\r\n <xsl:if test=\"string($date) != \'\'\">\r\n <xsl:choose>\r\n <xsl:when test=\"contains(string($date),\'T\')\">\r\n <xsl:call-template name=\"hl7Date\">\r\n <xsl:with-param name=\"date\" select=\"xs:date(substring-before($date,\'T\'))\" />\r\n </xsl:call-template>\r\n </xsl:when>\r\n <xsl:otherwise>\r\n <xsl:value-of select=\"concat(year-from-date($date),format-number(month-from-date($date),\'00\'),format-number(day-from-date($date),\'00\'))\" />\r\n </xsl:otherwise>\r\n </xsl:choose> \r\n </xsl:if>\r\n</xsl:template>\r\n\r\n<!-- Generate HL7-formatted time -->\r\n<xsl:template name=\"hl7Time\">\r\n <xsl:param name=\"time\" />\r\n <xsl:if test=\"$time != \'\'\">\r\n <xsl:value-of select=\"concat(format-number(hours-from-time($time),\'00\'),format-number(minutes-from-time($time),\'00\'),format-number(floor(seconds-from-time($time)),\'00\'))\" />\r\n </xsl:if>\r\n</xsl:template>\r\n\r\n</xsl:stylesheet>' |
|---|
| 439 | | WHERE xslt = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n\r\n<!--\r\nOpenMRS FormEntry Form HL7 Translation\r\n\r\nThis XSLT is used to translate OpenMRS forms from XML into HL7 2.5 format\r\n\r\n@author Burke Mamlin, MD\r\n@author Ben Wolfe\r\n@version 1.9.4\r\n\r\n1.9.4 - add support for message uid (as HL7 control id) and transform of patient.health_center to Discharge to Location (PV1-37)\r\n1.9.3 - fixed rounding error on timestamp (tenths of seconds getting rounded up, causing \"60\" seconds in some cases) \r\n1.9.2 - first generally useful version\r\n-->\r\n\r\n<xsl:stylesheet version=\"2.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:xdt=\"http://www.w3.org/2005/xpath-datatypes\">\r\n <xsl:output method=\"text\" version=\"1.0\" encoding=\"UTF-8\" indent=\"no\"/>\r\n\r\n<xsl:variable name=\"SENDING-APPLICATION\">FORMENTRY</xsl:variable>\r\n<xsl:variable name=\"SENDING-FACILITY\">AMRS.ELD</xsl:variable>\r\n<xsl:variable name=\"RECEIVING-APPLICATION\">HL7LISTENER</xsl:variable>\r\n<xsl:variable name=\"RECEIVING-FACILITY\">AMRS.ELD</xsl:variable>\r\n<xsl:variable name=\"PATIENT-AUTHORITY\"></xsl:variable> <!-- leave blank for internal id, max 20 characters -->\r\n <!-- for now, must match patient_identifier_type.name -->\r\n<xsl:variable name=\"FORM-AUTHORITY\">AMRS.ELD.FORMID</xsl:variable> <!-- max 20 characters -->\r\n\r\n<xsl:template match=\"/\">\r\n <xsl:apply-templates />\r\n</xsl:template>\r\n\r\n<!-- Form template -->\r\n<xsl:template match=\"form\">\r\n <!-- MSH Header -->\r\n <xsl:text>MSH|^~\\&</xsl:text> <!-- Message header, personAttributeType separator, and encoding characters -->\r\n <xsl:text>|</xsl:text> <!-- MSH-3 Sending application -->\r\n <xsl:value-of select=\"$SENDING-APPLICATION\" />\r\n <xsl:text>|</xsl:text> <!-- MSH-4 Sending facility -->\r\n <xsl:value-of select=\"$SENDING-FACILITY\" />\r\n <xsl:text>|</xsl:text> <!-- MSH-5 Receiving application -->\r\n <xsl:value-of select=\"$RECEIVING-APPLICATION\" />\r\n <xsl:text>|</xsl:text> <!-- MSH-6 Receiving facility -->\r\n <xsl:value-of select=\"$RECEIVING-FACILITY\" />\r\n <xsl:text>|</xsl:text> <!-- MSH-7 Date/time message sent -->\r\n <xsl:call-template name=\"hl7Timestamp\">\r\n <xsl:with-param name=\"date\" select=\"current-dateTime()\" />\r\n </xsl:call-template>\r\n <xsl:text>|</xsl:text> <!-- MSH-8 Security -->\r\n <xsl:text>|ORU^R01</xsl:text> <!-- MSH-9 Message type ^ Event type (observation report unsolicited) -->\r\n <xsl:text>|</xsl:text> <!-- MSH-10 Message control ID -->\r\n <xsl:choose>\r\n <xsl:when test=\"header/uid\">\r\n <xsl:value-of select=\"header/uid\" />\r\n </xsl:when>\r\n <xsl:otherwise>\r\n <xsl:value-of select=\"patient/patient.patient_id\" />\r\n <xsl:call-template name=\"hl7Timestamp\">\r\n <xsl:with-param name=\"date\" select=\"current-dateTime()\" />\r\n </xsl:call-template>\r\n </xsl:otherwise>\r\n </xsl:choose>\r\n <xsl:text>|P</xsl:text> <!-- MSH-11 Processing ID -->\r\n <xsl:text>|2.5</xsl:text> <!-- MSH-12 HL7 version -->\r\n <xsl:text>|1</xsl:text> <!-- MSH-13 Message sequence number -->\r\n <xsl:text>|</xsl:text> <!-- MSH-14 Continuation Pointer -->\r\n <xsl:text>|</xsl:text> <!-- MSH-15 Accept Acknowledgement Type -->\r\n <xsl:text>|</xsl:text> <!-- MSH-16 Application Acknowledgement Type -->\r\n <xsl:text>|</xsl:text> <!-- MSH-17 Country Code -->\r\n <xsl:text>|</xsl:text> <!-- MSH-18 Character Set -->\r\n <xsl:text>|</xsl:text> <!-- MSH-19 Principal Language of Message -->\r\n <xsl:text>|</xsl:text> <!-- MSH-20 Alternate Character Set Handling Scheme -->\r\n <xsl:text>|</xsl:text> <!-- MSH-21 Message Profile Identifier -->\r\n <xsl:value-of select=\"@id\" />\r\n <xsl:text>^</xsl:text>\r\n <xsl:value-of select=\"$FORM-AUTHORITY\" />\r\n <xsl:text>
</xsl:text>\r\n\r\n <!-- PID header -->\r\n <xsl:text>PID</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- PID-1 Set ID -->\r\n <xsl:text>|</xsl:text> <!-- PID-2 (deprecated) Patient ID -->\r\n <xsl:text>|</xsl:text> <!-- PID-3 Patient Identifier List -->\r\n <xsl:call-template name=\"patient_id\">\r\n <xsl:with-param name=\"pid\" select=\"patient/patient.patient_id\" />\r\n <xsl:with-param name=\"auth\" select=\"$PATIENT-AUTHORITY\" />\r\n <xsl:with-param name=\"type\" select=\"L\" />\r\n </xsl:call-template>\r\n <xsl:if test=\"patient/patient.previous_mrn and string-length(patient/patient.previous_mrn) > 0\">\r\n <xsl:text>~</xsl:text>\r\n <xsl:call-template name=\"patient_id\">\r\n <xsl:with-param name=\"pid\" select=\"patient/patient.previous_mrn\" />\r\n <xsl:with-param name=\"auth\" select=\"$PATIENT-AUTHORITY\" />\r\n <xsl:with-param name=\"type\" select=\"PRIOR\" />\r\n </xsl:call-template>\r\n </xsl:if>\r\n <!-- Additional patient identifiers -->\r\n <!-- This example is for an MTCT-PLUS identifier used in the AMPATH project in Kenya (skipped if not present) -->\r\n <xsl:if test=\"patient/patient.mtctplus_id and string-length(patient/patient.mtctplus_id) > 0\">\r\n <xsl:text>~</xsl:text>\r\n <xsl:call-template name=\"patient_id\">\r\n <xsl:with-param name=\"pid\" select=\"patient/patient.mtctplus_id\" />\r\n <xsl:with-param name=\"auth\" select=\"$PATIENT-AUTHORITY\" />\r\n <xsl:with-param name=\"type\" select=\"MTCTPLUS\" />\r\n </xsl:call-template>\r\n </xsl:if>\r\n <xsl:text>|</xsl:text> <!-- PID-4 (deprecated) Alternate patient ID -->\r\n <!-- PID-5 Patient name -->\r\n <xsl:text>|</xsl:text> <!-- Family name -->\r\n <xsl:value-of select=\"patient/patient.family_name\" />\r\n <xsl:text>^</xsl:text> <!-- Given name -->\r\n <xsl:value-of select=\"patient/patient.given_name\" />\r\n <xsl:text>^</xsl:text> <!-- Middle name -->\r\n <xsl:value-of select=\"patient/patient.middle_name\" />\r\n <xsl:text>|</xsl:text> <!-- PID-6 Mother\'s maiden name -->\r\n <xsl:text>|</xsl:text> <!-- PID-7 Date/Time of Birth -->\r\n <xsl:value-of select=\"patient/patient.date_of_birth\" />\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n \r\n <!-- PV1 header -->\r\n <xsl:text>PV1</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- PV1-1 Sub ID -->\r\n <xsl:text>|O</xsl:text> <!-- PV1-2 Patient class (O = outpatient) -->\r\n <xsl:text>|</xsl:text> <!-- PV1-3 Patient location -->\r\n <xsl:value-of select=\"encounter/encounter.location_id\" />\r\n <xsl:text>|</xsl:text> <!-- PV1-4 Admission type (2 = return) -->\r\n <xsl:text>|</xsl:text> <!-- PV1-5 Pre-Admin Number -->\r\n <xsl:text>|</xsl:text> <!-- PV1-6 Prior Patient Location -->\r\n <xsl:text>|</xsl:text> <!-- PV1-7 Attending Doctor -->\r\n <xsl:value-of select=\"encounter/encounter.provider_id\" />\r\n <xsl:text>|</xsl:text> <!-- PV1-8 Referring Doctor -->\r\n <xsl:text>|</xsl:text> <!-- PV1-9 Consulting Doctor -->\r\n <xsl:text>|</xsl:text> <!-- PV1-10 Hospital Service -->\r\n <xsl:text>|</xsl:text> <!-- PV1-11 Temporary Location -->\r\n <xsl:text>|</xsl:text> <!-- PV1-12 Preadmin Test Indicator -->\r\n <xsl:text>|</xsl:text> <!-- PV1-13 Re-adminssion Indicator -->\r\n <xsl:text>|</xsl:text> <!-- PV1-14 Admit Source -->\r\n <xsl:text>|</xsl:text> <!-- PV1-15 Ambulatory Status -->\r\n <xsl:text>|</xsl:text> <!-- PV1-16 VIP Indicator -->\r\n <xsl:text>|</xsl:text> <!-- PV1-17 Admitting Doctor -->\r\n <xsl:text>|</xsl:text> <!-- PV1-18 Patient Type -->\r\n <xsl:text>|</xsl:text> <!-- PV1-19 Visit Number -->\r\n <xsl:text>|</xsl:text> <!-- PV1-20 Financial Class -->\r\n <xsl:text>|</xsl:text> <!-- PV1-21 Charge Price Indicator -->\r\n <xsl:text>|</xsl:text> <!-- PV1-22 Courtesy Code -->\r\n <xsl:text>|</xsl:text> <!-- PV1-23 Credit Rating -->\r\n <xsl:text>|</xsl:text> <!-- PV1-24 Contract Code -->\r\n <xsl:text>|</xsl:text> <!-- PV1-25 Contract Effective Date -->\r\n <xsl:text>|</xsl:text> <!-- PV1-26 Contract Amount -->\r\n <xsl:text>|</xsl:text> <!-- PV1-27 Contract Period -->\r\n <xsl:text>|</xsl:text> <!-- PV1-28 Interest Code -->\r\n <xsl:text>|</xsl:text> <!-- PV1-29 Transfer to Bad Debt Code -->\r\n <xsl:text>|</xsl:text> <!-- PV1-30 Transfer to Bad Debt Date -->\r\n <xsl:text>|</xsl:text> <!-- PV1-31 Bad Debt Agency Code -->\r\n <xsl:text>|</xsl:text> <!-- PV1-31 Bad Debt Transfer Amount -->\r\n <xsl:text>|</xsl:text> <!-- PV1-33 Bad Debt Recovery Amount -->\r\n <xsl:text>|</xsl:text> <!-- PV1-34 Delete Account Indicator -->\r\n <xsl:text>|</xsl:text> <!-- PV1-35 Delete Account Date -->\r\n <xsl:text>|</xsl:text> <!-- PV1-36 Discharge Disposition -->\r\n <xsl:text>|</xsl:text> <!-- PV1-37 Discharge To Location -->\r\n <xsl:if test=\"patient/patient.health_center\">\r\n <xsl:value-of select=\"replace(patient/patient.health_center,\'\\^\',\'&\')\" />\r\n </xsl:if>\r\n <xsl:text>|</xsl:text> <!-- PV1-38 Diet Type -->\r\n <xsl:text>|</xsl:text> <!-- PV1-39 Servicing Facility -->\r\n <xsl:text>|</xsl:text> <!-- PV1-40 Bed Status -->\r\n <xsl:text>|</xsl:text> <!-- PV1-41 Account Status -->\r\n <xsl:text>|</xsl:text> <!-- PV1-42 Pending Location -->\r\n <xsl:text>|</xsl:text> <!-- PV1-43 Prior Temporary Location -->\r\n <xsl:text>|</xsl:text> <!-- PV1-44 Admit Date/Time -->\r\n <xsl:call-template name=\"hl7Date\">\r\n <xsl:with-param name=\"date\" select=\"encounter/encounter.encounter_datetime\" />\r\n </xsl:call-template>\r\n <xsl:text>|</xsl:text> <!-- PV1-45 Discharge Date/Time -->\r\n <xsl:text>|</xsl:text> <!-- PV1-46 Current Patient Balance -->\r\n <xsl:text>|</xsl:text> <!-- PV1-47 Total Charges -->\r\n <xsl:text>|</xsl:text> <!-- PV1-48 Total Adjustments -->\r\n <xsl:text>|</xsl:text> <!-- PV1-49 Total Payments -->\r\n <xsl:text>|</xsl:text> <!-- PV1-50 Alternate Visit ID -->\r\n <xsl:text>|V</xsl:text> <!-- PV1-51 Visit Indicator -->\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n\r\n <!-- We use encounter date as the timestamp for each observation -->\r\n <xsl:variable name=\"encounterTimestamp\">\r\n <xsl:call-template name=\"hl7Date\">\r\n <xsl:with-param name=\"date\" select=\"encounter/encounter.encounter_datetime\" />\r\n </xsl:call-template>\r\n </xsl:variable>\r\n \r\n <!-- ORC Common Order Segment -->\r\n <xsl:text>ORC</xsl:text> <!-- Message type -->\r\n <xsl:text>|RE</xsl:text> <!-- ORC-1 Order Control (RE = obs to follow) -->\r\n <xsl:text>|</xsl:text> <!-- ORC-2 Placer Order Number -->\r\n <xsl:text>|</xsl:text> <!-- ORC-3 Filler Order Number -->\r\n <xsl:text>|</xsl:text> <!-- ORC-4 Placer Group Number -->\r\n <xsl:text>|</xsl:text> <!-- ORC-5 Order Status -->\r\n <xsl:text>|</xsl:text> <!-- ORC-6 Response Flag -->\r\n <xsl:text>|</xsl:text> <!-- ORC-7 Quantity/Timing -->\r\n <xsl:text>|</xsl:text> <!-- ORC-8 Parent -->\r\n <xsl:text>|</xsl:text> <!-- ORC-9 Date/Time of Transaction -->\r\n <xsl:call-template name=\"hl7Timestamp\">\r\n <xsl:with-param name=\"date\" select=\"xs:dateTime(header/date_entered)\" />\r\n </xsl:call-template>\r\n <xsl:text>|</xsl:text> <!-- ORC-10 Entered By -->\r\n <xsl:value-of select=\"header/enterer\" />\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n\r\n <!-- Observation(s) -->\r\n <xsl:variable name=\"obsList\" select=\"obs/*[(@openmrs_concept and value and value/text() != \'\') or *[@openmrs_concept and text()=\'true\']]\" />\r\n <xsl:variable name=\"obsListCount\" select=\"count($obsList)\" as=\"xs:integer\" />\r\n <!-- Observation OBR -->\r\n <xsl:text>OBR</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- OBR-1 Set ID -->\r\n <xsl:text>1</xsl:text>\r\n <xsl:text>|</xsl:text> <!-- OBR-2 Placer order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-3 Filler order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-4 OBR concept -->\r\n <xsl:value-of select=\"obs/@openmrs_concept\" />\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n\r\n <!-- observation OBXs -->\r\n <xsl:for-each select=\"$obsList\">\r\n <xsl:choose>\r\n <xsl:when test=\"value\">\r\n <xsl:call-template name=\"obsObx\">\r\n <xsl:with-param name=\"setId\" select=\"position()\" />\r\n <xsl:with-param name=\"datatype\" select=\"@openmrs_datatype\" />\r\n <xsl:with-param name=\"units\" select=\"@openmrs_units\" />\r\n <xsl:with-param name=\"concept\" select=\"@openmrs_concept\" />\r\n <xsl:with-param name=\"date\" select=\"date/text()\" />\r\n <xsl:with-param name=\"time\" select=\"time/text()\" />\r\n <xsl:with-param name=\"value\" select=\"value\" />\r\n <xsl:with-param name=\"encounterTimestamp\" select=\"$encounterTimestamp\" />\r\n </xsl:call-template>\r\n </xsl:when>\r\n <xsl:otherwise>\r\n <xsl:variable name=\"setId\" select=\"position()\" />\r\n <xsl:for-each select=\"*[@openmrs_concept and text() = \'true\']\">\r\n <xsl:call-template name=\"obsObx\">\r\n <xsl:with-param name=\"setId\" select=\"$setId\" />\r\n <xsl:with-param name=\"subId\" select=\"concat($setId,position())\" />\r\n <xsl:with-param name=\"datatype\" select=\"../@openmrs_datatype\" />\r\n <xsl:with-param name=\"units\" select=\"../@openmrs_units\" />\r\n <xsl:with-param name=\"concept\" select=\"../@openmrs_concept\" />\r\n <xsl:with-param name=\"date\" select=\"../date/text()\" />\r\n <xsl:with-param name=\"time\" select=\"../time/text()\" />\r\n <xsl:with-param name=\"value\" select=\"@openmrs_concept\" />\r\n <xsl:with-param name=\"encounterTimestamp\" select=\"$encounterTimestamp\" />\r\n </xsl:call-template>\r\n </xsl:for-each>\r\n </xsl:otherwise>\r\n </xsl:choose>\r\n </xsl:for-each>\r\n \r\n <!-- Grouped observation(s) -->\r\n <xsl:variable name=\"obsGroupList\" select=\"obs/*[@openmrs_concept and not(date) and *[(@openmrs_concept and value and value/text() != \'\') or *[@openmrs_concept and text()=\'true\']]]\" />\r\n <xsl:variable name=\"obsGroupListCount\" select=\"count($obsGroupList)\" as=\"xs:integer\" />\r\n <xsl:for-each select=\"$obsGroupList\">\r\n <!-- Observation OBR -->\r\n <xsl:text>OBR</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- OBR-1 Set ID -->\r\n <xsl:value-of select=\"$obsListCount + position()\" />\r\n <xsl:text>|</xsl:text> <!-- OBR-2 Placer order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-3 Filler order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-4 OBR concept -->\r\n <xsl:value-of select=\"@openmrs_concept\" />\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n \r\n <!-- Generate OBXs -->\r\n <xsl:for-each select=\"*[(@openmrs_concept and value and value/text() != \'\') or *[@openmrs_concept and text()=\'true\']]\">\r\n <xsl:choose>\r\n <xsl:when test=\"value\">\r\n <xsl:call-template name=\"obsObx\">\r\n <xsl:with-param name=\"setId\" select=\"position()\" />\r\n <xsl:with-param name=\"subId\" select=\"1\" />\r\n <xsl:with-param name=\"datatype\" select=\"@openmrs_datatype\" />\r\n <xsl:with-param name=\"units\" select=\"@openmrs_units\" />\r\n <xsl:with-param name=\"concept\" select=\"@openmrs_concept\" />\r\n <xsl:with-param name=\"date\" select=\"date/text()\" />\r\n <xsl:with-param name=\"time\" select=\"time/text()\" />\r\n <xsl:with-param name=\"value\" select=\"value\" />\r\n <xsl:with-param name=\"encounterTimestamp\" select=\"$encounterTimestamp\" />\r\n </xsl:call-template>\r\n </xsl:when>\r\n <xsl:otherwise>\r\n <xsl:variable name=\"setId\" select=\"position()\" />\r\n <xsl:for-each select=\"*[@openmrs_concept and text() = \'true\']\">\r\n <xsl:call-template name=\"obsObx\">\r\n <xsl:with-param name=\"setId\" select=\"$setId\" />\r\n <xsl:with-param name=\"subId\" select=\"concat(\'1.\',position())\" />\r\n <xsl:with-param name=\"datatype\" select=\"../@openmrs_datatype\" />\r\n <xsl:with-param name=\"units\" select=\"../@openmrs_units\" />\r\n <xsl:with-param name=\"concept\" select=\"../@openmrs_concept\" />\r\n <xsl:with-param name=\"date\" select=\"../date/text()\" />\r\n <xsl:with-param name=\"time\" select=\"../time/text()\" />\r\n <xsl:with-param name=\"value\" select=\"@openmrs_concept\" />\r\n <xsl:with-param name=\"encounterTimestamp\" select=\"$encounterTimestamp\" />\r\n </xsl:call-template>\r\n </xsl:for-each>\r\n </xsl:otherwise>\r\n </xsl:choose>\r\n </xsl:for-each>\r\n </xsl:for-each>\r\n\r\n <!-- Problem list(s) -->\r\n <xsl:variable name=\"problemList\" select=\"problem_list/*[value[text() != \'\']]\" />\r\n <xsl:variable name=\"problemListCount\" select=\"count($problemList)\" as=\"xs:integer\" />\r\n <xsl:if test=\"$problemList\">\r\n <!-- Problem list OBR -->\r\n <xsl:text>OBR</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- OBR-1 Set ID -->\r\n <xsl:value-of select=\"$obsListCount + $obsGroupListCount + 1\" />\r\n <xsl:text>|</xsl:text> <!-- OBR-2 Placer order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-3 Filler order number -->\r\n <xsl:text>|</xsl:text> <!-- OBR-4 OBR concept -->\r\n <xsl:value-of select=\"problem_list/@openmrs_concept\" />\r\n <xsl:text>
</xsl:text> <!-- new line -->\r\n\r\n <!-- Problem list OBXs -->\r\n <xsl:for-each select=\"$problemList\">\r\n <xsl:call-template name=\"obsObx\">\r\n <xsl:with-param name=\"setId\" select=\"position()\" />\r\n <xsl:with-param name=\"datatype\" select=\"\'CWE\'\" />\r\n <xsl:with-param name=\"concept\" select=\"@openmrs_concept\" />\r\n <xsl:with-param name=\"date\" select=\"date/text()\" />\r\n <xsl:with-param name=\"time\" select=\"time/text()\" />\r\n <xsl:with-param name=\"value\" select=\"value\" />\r\n <xsl:with-param name=\"encounterTimestamp\" select=\"$encounterTimestamp\" />\r\n </xsl:call-template> \r\n </xsl:for-each>\r\n </xsl:if>\r\n \r\n <!-- Orders -->\r\n <xsl:variable name=\"orderList\" select=\"orders/*[*[@openmrs_concept and ((value and value/text() != \'\') or *[@openmrs_concept and text() = \'true\'])]]\" />\r\n <xsl:variable name=\"orderListCount\" select=\"count($orderList)\" as=\"xs:integer\" />\r\n <xsl:for-each select=\"$orderList\">\r\n <!-- Order section OBR -->\r\n <xsl:text>OBR</xsl:text> <!-- Message type -->\r\n <xsl:text>|</xsl:text> <!-- OBR-1 Set ID -->\r\n <xsl:value-of select=\"$obsListCount + $obsGroupListCount + $problemListCount + 1\" />\r\n <xsl:text>|</xsl:text> < |
|---|