FHIR IG analytics| Package | silfhirprofileig |
| Resource Type | StructureMap |
| Id | StructureMap-ExtractImagingRequest.json |
| FHIR Version | R5 |
| Source | https://build.fhir.org/ig/savannahghi/sil_fhir_profile_ig/StructureMap-ExtractImagingRequest.html |
| URL | https://fhir.slade360.co.ke/fhir/StructureMap/ExtractImagingRequest |
| Version | 0.1.0 |
| Status | active |
| Date | 2026-09-11T12:18:36+00:00 |
| Name | ExtractImagingRequest |
| Title | Imaging Request Extraction |
| Description | The X-ray and ultrasound request forms out as ServiceRequests: one per scan type ticked on an ultrasound request, or a single one carrying the region and view for an X-ray. The clinical question rides as a supporting Observation the request points at, because the SGHI ServiceRequest profile binds `reason` required to LOINC and the form takes free text -- so the indication cannot go in `reason` without inventing a code for it. |
No resources found
No resources found
Note: links and images are rebased to the (stated) source
Generated Narrative: StructureMap ExtractImagingRequest
/// url = 'https://fhir.slade360.co.ke/fhir/StructureMap/ExtractImagingRequest' /// name = 'ExtractImagingRequest' /// title = 'Imaging Request Extraction' /// status = 'active' /// description = 'The X-ray and ultrasound request forms out as ServiceRequests: one per scan type ticked on an ultrasound request, or a single one carrying the region and view for an X-ray. The clinical question rides as a supporting Observation the request points at, because the SGHI ServiceRequest profile binds `reason` required to LOINC and the form takes free text -- so the indication cannot go in `reason` without inventing a code for it.' uses "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse" alias QR as source uses "http://hl7.org/fhir/StructureDefinition/Bundle" alias Bundle as target uses "http://hl7.org/fhir/StructureDefinition/ServiceRequest" alias ServiceRequest as target uses "http://hl7.org/fhir/StructureDefinition/Observation" alias Observation as target group ExtractImagingRequest(source qr : QR, target bundle : Bundle) { qr -> bundle.type = 'transaction' "setBundleType"; // ── The indication, as a supporting Observation ───────────────────────── // Built first so the ServiceRequests below can point at it. It carries the // indication, the clinical summary and the provisional diagnosis: everything // the radiographer needs in order to tailor the study, which is the whole // reason the form asks for them. qr where (item.where(linkId = 'indication').answer.value.exists()) -> bundle.entry as entry, entry.resource = create('Observation') as obs then { qr -> obs, entry then BuildObsBase(qr, obs, entry) "base"; qr -> obs then SetSurveyCategory(qr, obs) "category"; qr -> obs.code as cc then { qr -> cc.coding as cg then { qr -> cg.system = 'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem' "sys"; qr -> cg.code = 'imaging-indication' "cd"; qr -> cg.display = 'Indication for imaging' "dsp"; } "coding"; } "code"; qr.item as it where (linkId = 'indication') then { it.answer first as a then { a.value as txt -> obs.note as n, n.text = txt "text"; }; } "note"; qr.item as it where (linkId = 'clinical-summary') then { it.answer first as a then { a.value as txt -> obs.note as n, n.text = txt "text"; }; } "note2"; qr.item as it where (linkId = 'provisional-diagnosis') then { it.answer first as a then { a.value as txt -> obs.note as n, n.text = txt "text"; }; } "note3"; } "indicationObservation"; // ── Last menstrual period ─────────────────────────────────────────────── // Extracted as its own Observation. The X-ray form asks for it so a woman of // childbearing age is not irradiated unknowingly in early pregnancy; that is // a safety check, and a safety check buried in a request's free text is not // one anybody can audit. qr.item as it where ((linkId = 'last-menstrual-period') and answer.value.exists()) -> bundle.entry as entry, entry.resource = create('Observation') as obs then { qr -> obs, entry then BuildObsBase(qr, obs, entry) "base"; qr -> obs then SetSurveyCategory(qr, obs) "category"; it -> obs.code as cc then { it -> cc.coding as cg then { it -> cg.system = 'http://loinc.org' "sys"; it -> cg.code = '8665-2' "cd"; it -> cg.display = 'Last menstrual period start date' "dsp"; } "coding"; } "code"; it.answer first as a then { a.value as v -> obs.value = cast(v, 'dateTime') "set"; }; } "measure_8665_2"; // ── The ultrasound requests, one per scan ticked ───────────────────────── // The scan type answer's own coding travels, so a request for a lower limb // venous Doppler is coded as exactly that rather than as "ultrasound". qr.item as it where (linkId = 'scan-type') then { it.answer as a -> bundle.entry as entry, entry.resource = create('ServiceRequest') as sr then { qr -> sr, entry then BuildServiceRequestBase(qr, sr, entry) "base"; a -> sr.status = 'active' "status"; a -> sr.intent = 'order' "intent"; a -> sr.category as cat then { a -> cat.coding as cg then { a -> cg.system = 'http://snomed.info/sct' "sys"; a -> cg.code = '363679005' "cd"; a -> cg.display = 'Imaging' "dsp"; } "coding"; } "category"; a.value as cv -> sr.code as cr, cr.concept as cc then { cv -> cc.coding = cv "coding"; cv.display as d -> cc.text = d "text"; } "codeFromAnswer"; qr -> sr then SetImagingRequestCommon(qr, sr) "common"; } "createUltrasoundRequest"; } "scanTypeGroup"; // ── The X-ray request ─────────────────────────────────────────────────── // One request, coded by its free text. Guarded on the modality being X-ray so // an ultrasound request does not also produce a second, uncoded request for // whatever was typed in the investigation line. qr where (item.where(linkId = 'request').item.where(linkId = 'request/modality').answer.value.ofType(Coding).code = 'modality-x-ray') then { qr.item as it where ((linkId = 'investigation-requested') and answer.value.exists()) -> bundle.entry as entry, entry.resource = create('ServiceRequest') as sr then { qr -> sr, entry then BuildServiceRequestBase(qr, sr, entry) "base"; it -> sr.status = 'active' "status"; it -> sr.intent = 'order' "intent"; it -> sr.category as cat then { it -> cat.coding as cg then { it -> cg.system = 'http://snomed.info/sct' "sys"; it -> cg.code = '363679005' "cd"; it -> cg.display = 'Imaging' "dsp"; } "coding"; } "category"; it.answer first as a then { a.value as txt -> sr.code as cr, cr.concept as cc, cc.text = txt "codeText"; }; qr -> sr then SetImagingRequestCommon(qr, sr) "common"; } "createXrayRequest"; } "xrayGroup"; } // Everything both request shapes share: who asked, when, how urgently, from // which department, and the clinical summary as a note. Factored into a group // because it is identical for an X-ray and an ultrasound and drifting copies is // how one of them silently loses its priority. group SetImagingRequestCommon(source qr : QR, target sr : ServiceRequest) { qr.authored as t -> sr.authoredOn = t "authoredOn"; qr.encounter as e -> sr.encounter = e; qr.item as g where (linkId = 'request') then { g.item as rq where ((linkId = 'request/requester') and answer.value.exists()) then { rq.answer first as a then { a.value as ref -> sr.requester = ref "requester"; }; } "requesterRule"; // Priority is a code on ServiceRequest, not a Coding: it takes the code // alone and has nowhere to record the system it came from. g.item as pr where ((linkId = 'request/priority') and answer.value.exists()) then { pr.answer first as a then { a.value as cv then { cv.code as c -> sr.priority = c "priorityCode"; } "coding"; }; } "priorityRule"; g.item as dp where ((linkId = 'request/department') and answer.value.exists()) then { dp.answer first as a then { a.value as txt -> sr.note as n, n.text = txt "departmentNote"; }; } "departmentRule"; } "requestGroup"; qr.item as ind where (linkId = 'indication') then { ind.answer first as a then { a.value as txt -> sr.note as n, n.text = txt "indicationNote"; }; } "indicationRule"; qr.item as cs where (linkId = 'clinical-summary') then { cs.answer first as a then { a.value as txt -> sr.note as n, n.text = txt "clinicalSummaryNote"; }; } "clinicalSummaryRule"; } // ───────────────────────────────────────────────────────────────────────────── // Shared scaffolding. Repeated in each map rather than imported: the transform // engine resolves `imports` against whatever StructureMaps happen to be on the // server, and a form that stops extracting because a shared map was not // uploaded is a worse failure than a duplicated group. // Two notes on what the publisher's StructureMap validator says about this file. // Source parameters below are left untyped on purpose. Writing `: Element` makes // the validator compare QuestionnaireResponse.item against the literal 'Element' // and report them as incompatible with each other, which is noise, not a finding. // `evaluate(context, expression)` is flagged as "takes 1 parameter but 2 were // found". Leave it. The FML parser in the same jar refuses the one-argument form // outright -- it wants a parameter, a comma, then the FHIRPath -- so the // publisher is objecting to what its own compiler emits. Two arguments is the // only form that compiles, and it is what the R5 transform engine executes. // ───────────────────────────────────────────────────────────────────────────── group BuildObsBase(source qr : QR, target obs : Observation, target entry) { qr -> obs then SetResponseProvenance(qr, obs) "responseProvenance"; qr -> obs.id = uuid() then SetObservationFullUrl(obs, entry) "idAndFullUrl"; qr -> entry.request as request then { qr -> request.method = 'POST' "requestMethod"; qr -> request.url = 'Observation' "requestUrl"; } "entryRequest"; qr -> obs.status = 'final' "status"; qr.subject as s -> obs.subject = s; qr.encounter as e -> obs.encounter = e; qr.authored as t -> obs.effective = t "effective"; qr.source as src -> obs.performer = src "performerFromSource"; qr where (source.exists().not()) then { qr.author as a -> obs.performer = a "performerFromAuthor"; } "performerFallback"; // A stored response's id already reads "QuestionnaireResponse/<id>", so it is // a relative reference as it stands. The hasValue() guard is what stops an // unsaved response -- one posted straight to $extract rather than saved first // -- from writing "QuestionnaireResponse/null" into the record. qr.id as qid where ($this.hasValue()) -> obs.derivedFrom = create('Reference') as ref, ref.reference = qid "linkQuestionnaireResponse"; } group SetObservationFullUrl(source obs : Observation, target entry) { obs.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/Observation/', id) "assignFullUrl"; } // The two answer shapes a component can carry. Both read the answer through the // untyped `.value` accessor: reading `valueCoding` or `valueQuantity` by its // typed property name fails at transform time on HAPI R5 with "Attempt to read // invalid property ... on QuestionnaireResponse.item.answer". group SetComponentCodedValue(source it, target comp) { it.answer first as a then { a.value as cv -> comp.value = create('CodeableConcept') as cc then { cv -> cc.coding = cv "valueCoding"; cv.display as d -> cc.text = d "valueText"; } "codedValue"; } "componentAnswer"; } group SetComponentValue(source it, target comp) { it.answer first as a then { a.value as v -> comp.value = v "plainValue"; } "componentAnswer"; } group SetSurveyCategory(source qr : QR, target obs : Observation) { qr -> obs.category as cat then { qr -> cat.coding as coding then { qr -> coding.system = 'http://terminology.hl7.org/CodeSystem/observation-category' "categorySystem"; qr -> coding.code = 'survey' "categoryCode"; qr -> coding.display = 'Survey' "categoryDisplay"; } "categoryCoding"; } "category"; } group SetVitalSignsCategory(source qr : QR, target obs : Observation) { qr -> obs.category as cat then { qr -> cat.coding as coding then { qr -> coding.system = 'http://terminology.hl7.org/CodeSystem/observation-category' "categorySystem"; qr -> coding.code = 'vital-signs' "categoryCode"; qr -> coding.display = 'Vital Signs' "categoryDisplay"; } "categoryCoding"; } "category"; } group BuildServiceRequestBase(source qr : QR, target r : ServiceRequest, target entry) { qr -> r then SetResponseProvenance(qr, r) "responseProvenance"; qr -> r.id = uuid() then SetServiceRequestFullUrl(r, entry) "idAndFullUrl"; qr -> entry.request as request then { qr -> request.method = 'POST' "requestMethod"; qr -> request.url = 'ServiceRequest' "requestUrl"; } "entryRequest"; qr.subject as s -> r.subject = s; } group SetServiceRequestFullUrl(source r : ServiceRequest, target entry) { r.id as id -> entry.fullUrl = append('https://fhir.slade360.co.ke/fhir/ServiceRequest/', id) "assignFullUrl"; } // ── Provenance and tenancy ─────────────────────────────────────────────────── // Two tags on everything this map creates. The first says which questionnaire // produced it, so a form that reopens mid-admission recalls its own earlier // entries and not another form's. The second copies the tenant tags off the // response, because nothing else on the path puts them there. // The code is the form's document type, not the questionnaire's id: every // environment mints its own ids, and there is only one set of maps, so an id // here would tie the tag to whichever environment stamped it. // ── Provenance and tenancy ─────────────────────────────────────────────────── group SetResponseProvenance(source qr : QR, target r) { qr -> r.meta as m then { qr -> m.tag as t then { qr -> t.system = 'http://slade360edi.com/questionnaire-provenance' "provenanceSystem"; qr -> t.code = 'imaging-request' "provenanceCode"; qr -> t.display = 'Imaging request' "provenanceDisplay"; } "provenanceTag"; } "provenanceMeta"; // Every tag the response carries, onto the resource. `meta` is 0..1, so this // lands on the same meta the rule above created rather than a second one. qr.meta as qm then { qm.tag as qt -> r.meta as m, m.tag = qt "copyTag"; } "tenantTags"; }
{
"resourceType": "StructureMap",
"id": "ExtractImagingRequest",
"text": {
"status": "generated",
"div": "<!-- snip (see above) -->"
},
"url": "https://fhir.slade360.co.ke/fhir/StructureMap/ExtractImagingRequest",
"version": "0.1.0",
"name": "ExtractImagingRequest",
"title": "Imaging Request Extraction",
"status": "active",
"date": "2026-09-11T12:18:36+00:00",
"publisher": "Kathurima Kimathi",
"contact": [
{
"name": "Kathurima Kimathi",
"telecom": [
{
"system": "url",
"value": "https://www.linkedin.com/in/kathurima-kimathi/"
},
{
"system": "email",
"value": "kathurimakimathi415@gmail.com"
}
]
},
{
"name": "Oscar John",
"telecom": [
{
"system": "email",
"value": "oscarjohnotieno@gmail.com",
"use": "work"
}
]
},
{
"name": "Kennedy Omondi",
"telecom": [
{
"system": "email",
"value": "kennankole@gmail.com",
"use": "work"
}
]
}
],
"description": "The X-ray and ultrasound request forms out as ServiceRequests: one per scan type ticked on an ultrasound request, or a single one carrying the region and view for an X-ray. The clinical question rides as a supporting Observation the request points at, because the SGHI ServiceRequest profile binds `reason` required to LOINC and the form takes free text -- so the indication cannot go in `reason` without inventing a code for it.",
"structure": [
{
"url": "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse",
"mode": "source",
"alias": "QR"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/Bundle",
"mode": "target",
"alias": "Bundle"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/ServiceRequest",
"mode": "target",
"alias": "ServiceRequest"
},
{
"url": "http://hl7.org/fhir/StructureDefinition/Observation",
"mode": "target",
"alias": "Observation"
}
],
"group": [
{
"name": "ExtractImagingRequest",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "bundle",
"type": "Bundle",
"mode": "target"
}
],
"rule": [
{
"name": "setBundleType",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "bundle",
"element": "type",
"transform": "copy",
"parameter": [
{
"valueString": "transaction"
}
]
}
]
},
{
"name": "indicationObservation",
"source": [
{
"context": "qr",
"condition": "item.where(linkId = 'indication').answer.value.exists()"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "obs",
"transform": "create",
"parameter": [
{
"valueString": "Observation"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildObsBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "obs"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetSurveyCategory",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "obs"
}
]
}
]
},
{
"name": "code",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs",
"element": "code",
"variable": "cc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cc",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "imaging-indication"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Indication for imaging"
}
]
}
]
}
]
}
]
},
{
"name": "note",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "linkId = 'indication'"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "text",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "obs",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "note2",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "linkId = 'clinical-summary'"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "text",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "obs",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "note3",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "linkId = 'provisional-diagnosis'"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "text",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "obs",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
}
],
"documentation": "── The indication, as a supporting Observation ─────────────────────────\r\nBuilt first so the ServiceRequests below can point at it. It carries the\r\nindication, the clinical summary and the provisional diagnosis: everything\r\nthe radiographer needs in order to tailor the study, which is the whole\r\nreason the form asks for them."
},
{
"name": "measure_8665_2",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "(linkId = 'last-menstrual-period') and answer.value.exists()"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "obs",
"transform": "create",
"parameter": [
{
"valueString": "Observation"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildObsBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "obs"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetSurveyCategory",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "obs"
}
]
}
]
},
{
"name": "code",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "obs",
"element": "code",
"variable": "cc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cc",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://loinc.org"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "8665-2"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Last menstrual period start date"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "set",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "obs",
"element": "value",
"transform": "cast",
"parameter": [
{
"valueId": "v"
},
{
"valueString": "dateTime"
}
]
}
]
}
]
}
],
"documentation": "── Last menstrual period ───────────────────────────────────────────────\r\nExtracted as its own Observation. The X-ray form asks for it so a woman of\r\nchildbearing age is not irradiated unknowingly in early pregnancy; that is\r\na safety check, and a safety check buried in a request's free text is not\r\none anybody can audit."
},
{
"name": "scanTypeGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "linkId = 'scan-type'"
}
],
"rule": [
{
"name": "createUltrasoundRequest",
"source": [
{
"context": "it",
"element": "answer",
"variable": "a"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "sr",
"transform": "create",
"parameter": [
{
"valueString": "ServiceRequest"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "sr"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildServiceRequestBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "sr"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "status",
"source": [
{
"context": "a"
}
],
"target": [
{
"context": "sr",
"element": "status",
"transform": "copy",
"parameter": [
{
"valueString": "active"
}
]
}
]
},
{
"name": "intent",
"source": [
{
"context": "a"
}
],
"target": [
{
"context": "sr",
"element": "intent",
"transform": "copy",
"parameter": [
{
"valueString": "order"
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "a"
}
],
"target": [
{
"context": "sr",
"element": "category",
"variable": "cat"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "a"
}
],
"target": [
{
"context": "cat",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "a"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://snomed.info/sct"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "a"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "363679005"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "a"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Imaging"
}
]
}
]
}
]
}
]
},
{
"name": "codeFromAnswer",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv"
}
],
"target": [
{
"context": "sr",
"element": "code",
"variable": "cr"
},
{
"context": "cr",
"element": "concept",
"variable": "cc"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "cc",
"element": "coding",
"transform": "copy",
"parameter": [
{
"valueId": "cv"
}
]
}
]
},
{
"name": "text",
"source": [
{
"context": "cv",
"element": "display",
"variable": "d"
}
],
"target": [
{
"context": "cc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "d"
}
]
}
]
}
]
},
{
"name": "common",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "sr"
}
],
"dependent": [
{
"name": "SetImagingRequestCommon",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "sr"
}
]
}
]
}
]
}
],
"documentation": "── The ultrasound requests, one per scan ticked ─────────────────────────\r\nThe scan type answer's own coding travels, so a request for a lower limb\r\nvenous Doppler is coded as exactly that rather than as \"ultrasound\"."
},
{
"name": "xrayGroup",
"source": [
{
"context": "qr",
"condition": "item.where(linkId = 'request').item.where(linkId = 'request/modality').answer.value.ofType(Coding).code = 'modality-x-ray'"
}
],
"rule": [
{
"name": "createXrayRequest",
"source": [
{
"context": "qr",
"element": "item",
"variable": "it",
"condition": "(linkId = 'investigation-requested') and answer.value.exists()"
}
],
"target": [
{
"context": "bundle",
"element": "entry",
"variable": "entry"
},
{
"context": "entry",
"element": "resource",
"variable": "sr",
"transform": "create",
"parameter": [
{
"valueString": "ServiceRequest"
}
]
}
],
"rule": [
{
"name": "base",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "sr"
},
{
"context": "entry"
}
],
"dependent": [
{
"name": "BuildServiceRequestBase",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "sr"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "status",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sr",
"element": "status",
"transform": "copy",
"parameter": [
{
"valueString": "active"
}
]
}
]
},
{
"name": "intent",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sr",
"element": "intent",
"transform": "copy",
"parameter": [
{
"valueString": "order"
}
]
}
]
},
{
"name": "category",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "sr",
"element": "category",
"variable": "cat"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cat",
"element": "coding",
"variable": "cg"
}
],
"rule": [
{
"name": "sys",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://snomed.info/sct"
}
]
}
]
},
{
"name": "cd",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "363679005"
}
]
}
]
},
{
"name": "dsp",
"source": [
{
"context": "it"
}
],
"target": [
{
"context": "cg",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Imaging"
}
]
}
]
}
]
}
]
},
{
"name": "answer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "codeText",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "sr",
"element": "code",
"variable": "cr"
},
{
"context": "cr",
"element": "concept",
"variable": "cc"
},
{
"context": "cc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
},
{
"name": "common",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "sr"
}
],
"dependent": [
{
"name": "SetImagingRequestCommon",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "sr"
}
]
}
]
}
]
}
],
"documentation": "── The X-ray request ───────────────────────────────────────────────────\r\nOne request, coded by its free text. Guarded on the modality being X-ray so\r\nan ultrasound request does not also produce a second, uncoded request for\r\nwhatever was typed in the investigation line."
}
]
},
{
"name": "SetImagingRequestCommon",
"documentation": "Everything both request shapes share: who asked, when, how urgently, from\r\nwhich department, and the clinical summary as a note. Factored into a group\r\nbecause it is identical for an X-ray and an ultrasound and drifting copies is\r\nhow one of them silently loses its priority.",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "sr",
"type": "ServiceRequest",
"mode": "target"
}
],
"rule": [
{
"name": "authoredOn",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t"
}
],
"target": [
{
"context": "sr",
"element": "authoredOn",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
]
},
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e"
}
],
"target": [
{
"context": "sr",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "requestGroup",
"source": [
{
"context": "qr",
"element": "item",
"variable": "g",
"condition": "linkId = 'request'"
}
],
"rule": [
{
"name": "requesterRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "rq",
"condition": "(linkId = 'request/requester') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "rq",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "requester",
"source": [
{
"context": "a",
"element": "value",
"variable": "ref"
}
],
"target": [
{
"context": "sr",
"element": "requester",
"transform": "copy",
"parameter": [
{
"valueId": "ref"
}
]
}
]
}
]
}
]
},
{
"name": "priorityRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "pr",
"condition": "(linkId = 'request/priority') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "pr",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "coding",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv"
}
],
"rule": [
{
"name": "priorityCode",
"source": [
{
"context": "cv",
"element": "code",
"variable": "c"
}
],
"target": [
{
"context": "sr",
"element": "priority",
"transform": "copy",
"parameter": [
{
"valueId": "c"
}
]
}
]
}
]
}
]
}
],
"documentation": "Priority is a code on ServiceRequest, not a Coding: it takes the code\r\nalone and has nowhere to record the system it came from."
},
{
"name": "departmentRule",
"source": [
{
"context": "g",
"element": "item",
"variable": "dp",
"condition": "(linkId = 'request/department') and answer.value.exists()"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "dp",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "departmentNote",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "sr",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "indicationRule",
"source": [
{
"context": "qr",
"element": "item",
"variable": "ind",
"condition": "linkId = 'indication'"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "ind",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "indicationNote",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "sr",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
},
{
"name": "clinicalSummaryRule",
"source": [
{
"context": "qr",
"element": "item",
"variable": "cs",
"condition": "linkId = 'clinical-summary'"
}
],
"rule": [
{
"name": "answer",
"source": [
{
"context": "cs",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "clinicalSummaryNote",
"source": [
{
"context": "a",
"element": "value",
"variable": "txt"
}
],
"target": [
{
"context": "sr",
"element": "note",
"variable": "n"
},
{
"context": "n",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "txt"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "BuildObsBase",
"documentation": "─────────────────────────────────────────────────────────────────────────────\r\nShared scaffolding. Repeated in each map rather than imported: the transform\r\nengine resolves `imports` against whatever StructureMaps happen to be on the\r\nserver, and a form that stops extracting because a shared map was not\r\nuploaded is a worse failure than a duplicated group.\r\nTwo notes on what the publisher's StructureMap validator says about this file.\r\nSource parameters below are left untyped on purpose. Writing `: Element` makes\r\nthe validator compare QuestionnaireResponse.item against the literal 'Element'\r\nand report them as incompatible with each other, which is noise, not a finding.\r\n`evaluate(context, expression)` is flagged as \"takes 1 parameter but 2 were\r\nfound\". Leave it. The FML parser in the same jar refuses the one-argument form\r\noutright -- it wants a parameter, a comma, then the FHIRPath -- so the\r\npublisher is objecting to what its own compiler emits. Two arguments is the\r\nonly form that compiles, and it is what the R5 transform engine executes.\r\n─────────────────────────────────────────────────────────────────────────────",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "obs",
"type": "Observation",
"mode": "target"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "responseProvenance",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs"
}
],
"dependent": [
{
"name": "SetResponseProvenance",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "obs"
}
]
}
]
},
{
"name": "idAndFullUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs",
"element": "id",
"transform": "uuid"
}
],
"dependent": [
{
"name": "SetObservationFullUrl",
"parameter": [
{
"valueId": "obs"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "entryRequest",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "entry",
"element": "request",
"variable": "request"
}
],
"rule": [
{
"name": "requestMethod",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "method",
"transform": "copy",
"parameter": [
{
"valueString": "POST"
}
]
}
]
},
{
"name": "requestUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "url",
"transform": "copy",
"parameter": [
{
"valueString": "Observation"
}
]
}
]
}
]
},
{
"name": "status",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs",
"element": "status",
"transform": "copy",
"parameter": [
{
"valueString": "final"
}
]
}
]
},
{
"name": "subject",
"source": [
{
"context": "qr",
"element": "subject",
"variable": "s"
}
],
"target": [
{
"context": "obs",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
},
{
"name": "encounter",
"source": [
{
"context": "qr",
"element": "encounter",
"variable": "e"
}
],
"target": [
{
"context": "obs",
"element": "encounter",
"transform": "copy",
"parameter": [
{
"valueId": "e"
}
]
}
]
},
{
"name": "effective",
"source": [
{
"context": "qr",
"element": "authored",
"variable": "t"
}
],
"target": [
{
"context": "obs",
"element": "effective",
"transform": "copy",
"parameter": [
{
"valueId": "t"
}
]
}
]
},
{
"name": "performerFromSource",
"source": [
{
"context": "qr",
"element": "source",
"variable": "src"
}
],
"target": [
{
"context": "obs",
"element": "performer",
"transform": "copy",
"parameter": [
{
"valueId": "src"
}
]
}
]
},
{
"name": "performerFallback",
"source": [
{
"context": "qr",
"condition": "source.exists().not()"
}
],
"rule": [
{
"name": "performerFromAuthor",
"source": [
{
"context": "qr",
"element": "author",
"variable": "a"
}
],
"target": [
{
"context": "obs",
"element": "performer",
"transform": "copy",
"parameter": [
{
"valueId": "a"
}
]
}
]
}
]
},
{
"name": "linkQuestionnaireResponse",
"source": [
{
"context": "qr",
"element": "id",
"variable": "qid",
"condition": "$this.hasValue()"
}
],
"target": [
{
"context": "obs",
"element": "derivedFrom",
"variable": "ref",
"transform": "create",
"parameter": [
{
"valueString": "Reference"
}
]
},
{
"context": "ref",
"element": "reference",
"transform": "copy",
"parameter": [
{
"valueId": "qid"
}
]
}
],
"documentation": "A stored response's id already reads \"QuestionnaireResponse/<id>\", so it is\r\na relative reference as it stands. The hasValue() guard is what stops an\r\nunsaved response -- one posted straight to $extract rather than saved first\r\n-- from writing \"QuestionnaireResponse/null\" into the record."
}
]
},
{
"name": "SetObservationFullUrl",
"input": [
{
"name": "obs",
"type": "Observation",
"mode": "source"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "assignFullUrl",
"source": [
{
"context": "obs",
"element": "id",
"variable": "id"
}
],
"target": [
{
"context": "entry",
"element": "fullUrl",
"transform": "append",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/Observation/"
},
{
"valueId": "id"
}
]
}
]
}
]
},
{
"name": "SetComponentCodedValue",
"documentation": "The two answer shapes a component can carry. Both read the answer through the\r\nuntyped `.value` accessor: reading `valueCoding` or `valueQuantity` by its\r\ntyped property name fails at transform time on HAPI R5 with \"Attempt to read\r\ninvalid property ... on QuestionnaireResponse.item.answer\".",
"input": [
{
"name": "it",
"mode": "source"
},
{
"name": "comp",
"mode": "target"
}
],
"rule": [
{
"name": "componentAnswer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "codedValue",
"source": [
{
"context": "a",
"element": "value",
"variable": "cv"
}
],
"target": [
{
"context": "comp",
"element": "value",
"variable": "cc",
"transform": "create",
"parameter": [
{
"valueString": "CodeableConcept"
}
]
}
],
"rule": [
{
"name": "valueCoding",
"source": [
{
"context": "cv"
}
],
"target": [
{
"context": "cc",
"element": "coding",
"transform": "copy",
"parameter": [
{
"valueId": "cv"
}
]
}
]
},
{
"name": "valueText",
"source": [
{
"context": "cv",
"element": "display",
"variable": "d"
}
],
"target": [
{
"context": "cc",
"element": "text",
"transform": "copy",
"parameter": [
{
"valueId": "d"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "SetComponentValue",
"input": [
{
"name": "it",
"mode": "source"
},
{
"name": "comp",
"mode": "target"
}
],
"rule": [
{
"name": "componentAnswer",
"source": [
{
"context": "it",
"element": "answer",
"listMode": "first",
"variable": "a"
}
],
"rule": [
{
"name": "plainValue",
"source": [
{
"context": "a",
"element": "value",
"variable": "v"
}
],
"target": [
{
"context": "comp",
"element": "value",
"transform": "copy",
"parameter": [
{
"valueId": "v"
}
]
}
]
}
]
}
]
},
{
"name": "SetSurveyCategory",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "obs",
"type": "Observation",
"mode": "target"
}
],
"rule": [
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs",
"element": "category",
"variable": "cat"
}
],
"rule": [
{
"name": "categoryCoding",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cat",
"element": "coding",
"variable": "coding"
}
],
"rule": [
{
"name": "categorySystem",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://terminology.hl7.org/CodeSystem/observation-category"
}
]
}
]
},
{
"name": "categoryCode",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "survey"
}
]
}
]
},
{
"name": "categoryDisplay",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Survey"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "SetVitalSignsCategory",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "obs",
"type": "Observation",
"mode": "target"
}
],
"rule": [
{
"name": "category",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "obs",
"element": "category",
"variable": "cat"
}
],
"rule": [
{
"name": "categoryCoding",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "cat",
"element": "coding",
"variable": "coding"
}
],
"rule": [
{
"name": "categorySystem",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://terminology.hl7.org/CodeSystem/observation-category"
}
]
}
]
},
{
"name": "categoryCode",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "vital-signs"
}
]
}
]
},
{
"name": "categoryDisplay",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "coding",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Vital Signs"
}
]
}
]
}
]
}
]
}
]
},
{
"name": "BuildServiceRequestBase",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"type": "ServiceRequest",
"mode": "target"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "responseProvenance",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r"
}
],
"dependent": [
{
"name": "SetResponseProvenance",
"parameter": [
{
"valueId": "qr"
},
{
"valueId": "r"
}
]
}
]
},
{
"name": "idAndFullUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r",
"element": "id",
"transform": "uuid"
}
],
"dependent": [
{
"name": "SetServiceRequestFullUrl",
"parameter": [
{
"valueId": "r"
},
{
"valueId": "entry"
}
]
}
]
},
{
"name": "entryRequest",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "entry",
"element": "request",
"variable": "request"
}
],
"rule": [
{
"name": "requestMethod",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "method",
"transform": "copy",
"parameter": [
{
"valueString": "POST"
}
]
}
]
},
{
"name": "requestUrl",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "request",
"element": "url",
"transform": "copy",
"parameter": [
{
"valueString": "ServiceRequest"
}
]
}
]
}
]
},
{
"name": "subject",
"source": [
{
"context": "qr",
"element": "subject",
"variable": "s"
}
],
"target": [
{
"context": "r",
"element": "subject",
"transform": "copy",
"parameter": [
{
"valueId": "s"
}
]
}
]
}
]
},
{
"name": "SetServiceRequestFullUrl",
"input": [
{
"name": "r",
"type": "ServiceRequest",
"mode": "source"
},
{
"name": "entry",
"mode": "target"
}
],
"rule": [
{
"name": "assignFullUrl",
"source": [
{
"context": "r",
"element": "id",
"variable": "id"
}
],
"target": [
{
"context": "entry",
"element": "fullUrl",
"transform": "append",
"parameter": [
{
"valueString": "https://fhir.slade360.co.ke/fhir/ServiceRequest/"
},
{
"valueId": "id"
}
]
}
]
}
]
},
{
"name": "SetResponseProvenance",
"documentation": "── Provenance and tenancy ───────────────────────────────────────────────────\r\nTwo tags on everything this map creates. The first says which questionnaire\r\nproduced it, so a form that reopens mid-admission recalls its own earlier\r\nentries and not another form's. The second copies the tenant tags off the\r\nresponse, because nothing else on the path puts them there.\r\nThe code is the form's document type, not the questionnaire's id: every\r\nenvironment mints its own ids, and there is only one set of maps, so an id\r\nhere would tie the tag to whichever environment stamped it.\r\n── Provenance and tenancy ───────────────────────────────────────────────────",
"input": [
{
"name": "qr",
"type": "QR",
"mode": "source"
},
{
"name": "r",
"mode": "target"
}
],
"rule": [
{
"name": "provenanceMeta",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "r",
"element": "meta",
"variable": "m"
}
],
"rule": [
{
"name": "provenanceTag",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "m",
"element": "tag",
"variable": "t"
}
],
"rule": [
{
"name": "provenanceSystem",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "t",
"element": "system",
"transform": "copy",
"parameter": [
{
"valueString": "http://slade360edi.com/questionnaire-provenance"
}
]
}
]
},
{
"name": "provenanceCode",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "t",
"element": "code",
"transform": "copy",
"parameter": [
{
"valueString": "imaging-request"
}
]
}
]
},
{
"name": "provenanceDisplay",
"source": [
{
"context": "qr"
}
],
"target": [
{
"context": "t",
"element": "display",
"transform": "copy",
"parameter": [
{
"valueString": "Imaging request"
}
]
}
]
}
]
}
]
},
{
"name": "tenantTags",
"source": [
{
"context": "qr",
"element": "meta",
"variable": "qm"
}
],
"rule": [
{
"name": "copyTag",
"source": [
{
"context": "qm",
"element": "tag",
"variable": "qt"
}
],
"target": [
{
"context": "r",
"element": "meta",
"variable": "m"
},
{
"context": "m",
"element": "tag",
"transform": "copy",
"parameter": [
{
"valueId": "qt"
}
]
}
]
}
],
"documentation": "Every tag the response carries, onto the resource. `meta` is 0..1, so this\r\nlands on the same meta the rule above created rather than a second one."
}
]
}
]
}