Downloads Documentation Community Contribute Demo






Show Sidebar
Login | Register
Show
Ignore:
Timestamp:
07/02/08 19:40:36 (5 months ago)
Author:
bmckown
Message:

Merging trunk to complex-obs [4379][4764]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • openmrs/branches/complex-obs/metadata/model/update-to-latest-db.mysqldiff.sql

    r4417 r4785  
    164164         
    165165        -- This creates rows in obs for parent obs groupers. It temporarily gives the obs grouping rows an obs_group_id 
    166         -- Tries to use the concept_set concept that the obs is in if there is only one.  If there is more than one, take from form_personAttributeType parent  
     166        -- Tries to use the concept_set concept that the obs is in if there is only one.  If there is more than one, take from form_field parent  
    167167        SELECT 'Creating rows in obs table representing obs groups from current data' as 'Current step (2/8):' FROM dual; 
    168168        INSERT INTO `obs`  
     
    192192                                                COALESCE(f2.concept_id, @OTHER_CONCEPT_ID ) as 'concept_id' 
    193193                                         FROM 
    194                                                 `personAttributeType` f, `personAttributeType` f2, `form_personAttributeType` ff, `form_personAttributeType` ff2, `form`, `encounter` 
     194                                                `field` f, `field` f2, `form_field` ff, `form_field` ff2, `form`, `encounter` 
    195195                                         WHERE 
    196196                                                encounter.encounter_id = obs.encounter_id AND 
    197197                                                encounter.form_id = form.form_id AND 
    198198                                                form.form_id = ff.form_id AND 
    199                                                 ff.personAttributeType_id = f.personAttributeType_id AND 
     199                                                ff.field_id = f.field_id AND 
    200200                                                f.concept_id = obs.concept_id AND 
    201                                                 ff.parent_form_personAttributeType = ff2.form_personAttributeType_id AND 
    202                                                 ff2.personAttributeType_id = f2.personAttributeType_id 
     201                                                ff.parent_form_field = ff2.form_field_id AND 
     202                                                ff2.field_id = f2.field_id 
    203203                                         LIMIT 1 
    204204                                        ) 
     
    220220        SELECT 'Fixing obs_group_id values on all obs that were grouped' as 'Current step: (3/8)' FROM dual; 
    221221        DROP TABLE IF EXISTS `new_obs_groups_mapping`; 
    222         CREATE TEMPORARY TABLE `new_obs_groups_mapping` ( 
    223           `grouper_obs_id` int(11) NOT NULL, 
    224           `obs_group_id` int(11) default NULL, 
    225           PRIMARY KEY  (`grouper_obs_id`) 
    226     ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
     222        CREATE TABLE `new_obs_groups_mapping` ( 
     223                `grouper_obs_id` int(11) NOT NULL, 
     224                `obs_group_id` int(11) default NULL, 
     225                PRIMARY KEY  (`grouper_obs_id`), 
     226                KEY `grouper` (`grouper_obs_id`), 
     227                KEY `the_group_id` (`obs_group_id`) 
     228        ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
    227229         
    228230        -- This populates the previous table 
     
    241243         
    242244        -- This changes the obs_group_ids on the obs table to point at the obs_id of the grouper obs 
     245        SELECT 'Applying temporary table values to obs table' as 'Current step: (3.5/8)' FROM dual; 
    243246        UPDATE  
    244247                `obs` o left join new_obs_groups_mapping mapping on o.obs_group_id = mapping.obs_group_id 
     
    264267        IF (SELECT COUNT(*)<>'0' FROM obs o WHERE concept_id = @OTHER_CONCEPT_ID AND EXISTS (SELECT * FROM obs o2 WHERE o2.obs_group_id = o.obs_id)) THEN 
    265268                SELECT 'These obs rows pertaining to obs_groups have the been given a generic concept_id. You should find and correct with their right grouping concept_id' AS '########## WARNING! #############' FROM DUAL; 
    266                 SELECT * FROM obs_group WHERE concept_id = @OTHER_CONCEPT_ID;  
     269                SELECT * FROM obs WHERE concept_id = @OTHER_CONCEPT_ID;  
    267270        END IF; 
    268271 
     
    270273        SELECT 'Cleaning up the obs that think they are in an obs_group but really are not.' AS 'Current step (5/8):' FROM dual; 
    271274        DROP TABLE IF EXISTS `single_member_obs_groups`; 
    272         CREATE TEMPORARY TABLE `single_member_obs_groups` ( 
     275        CREATE TABLE `single_member_obs_groups` ( 
    273276          `obs_id` int(11) NOT NULL, 
    274277      `obs_group_id` int(11) NOT NULL, 
    275           PRIMARY KEY  (`obs_id`) 
     278          PRIMARY KEY  (`obs_id`), 
     279          KEY `the_group_id` (`obs_group_id`) 
    276280    ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
    277281        INSERT INTO `single_member_obs_groups` 
     
    316320        -- create a temp table to hold the obs_id of obs groupers that need to be voided 
    317321        DROP TABLE IF EXISTS `obs_groupers_needing_voided`; 
    318         CREATE TEMPORARY TABLE `obs_groupers_needing_voided` ( 
     322        CREATE TABLE `obs_groupers_needing_voided` ( 
    319323                `obs_id` int(11) NOT NULL, 
    320324                `voided_by` int(11) default NULL, 
     
    436440        -- Upgrade all instances of XSLT 1.9.4 to 1.9.5 
    437441        UPDATE `form` 
    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|^~\\&amp;</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>&#x000d;</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>&#x000d;</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,\'\\^\',\'&amp;\')\" />\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>&#x000d;</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>&#x000d;</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>&#x000d;</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>&#x000d;</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>&#x000d;</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>&#x000d;</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>&#x000d;</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|^~\\&amp;</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>&#x000d;</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>&#x000d;</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,\'\\^\',\'&amp;\')\" />\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>&#x000d;</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>&#x000d;</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>&#x000d;</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>&#x000d;</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>&#x000d;</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>              <