¡Esta es una revisión vieja del documento!
Tabla de Contenidos
HL7 NOTAS
Software Necesarios
Un editor XML:
http://xml-copy-editor.sourceforge.net/
Páginas de Consulta
LOINC:
http://search.loinc.org/
CDA Tools:
http://cdatools.org/infocenter/index.jsp
Guias
Guia de elementos Mínimos para un CDA HL7v3
http://www.hl7spain.org/documents/comTec/cda/GuiaElementosMinimosCDA.pdf
Guía sobre los indicadores XSD
http://www.w3schools.com/schema/schema_complex_indicators.asp
http://www.milkzoft.com/blog/xml-schema/
Página antigua con buenos enlaces (en cache de google, ya no existe)
http://hl7book.net/
Validadores CDA
http://cdatools.org/validation/
https://www.lantanagroup.com/validator/
más recopilación de ejemplos interesantes:
https://github.com/chb/sample_ccdas
1 Estructura General CDA
1.1 Identificando el Cuerpo y la Cabecera
Al igual que una página de hipertexto html, tiene una cabecera y un cuerpo como elementos base, aunque la cabecera no está declarada dentro de una etiqueta identificable como <head> </head> como ocurre con html y xhtml, en el xml de HL7v3 CDA los diferentes nodos declarados como hijos de <ClinicalDocument> son la cabecera , pues describen al documento en sí mismo, los participantes y las relaciones con otros documentos (hl7spain.org GuiaElementosMinimosCDA pag 27) excepto el nodo <component>, hermano de estos nodos por ser también hijo de <ClinicalDocument>, al tener como nodo hijo a <structuredBody> cuando es estructurado o <nonXMLBody> cuando no es estructurado, se lo reconoce como el cuerpo; pues encerrará parte del Arbol XML con la información clínica del paciente.
Aquí una estructura de XHTML resumida
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <!-- comienza la cabecera --> <head> <title>Titulo del documento</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="generator" content="Programa"> <script type="text/javascript"> //aquí script </script> <style type="text/css"> /*aquí css */ </style> </head> <!-- comienza el cuerpo --> <body> <h1>esto es un título</h1> <p>Esto es un parrafo</p> <h2>otro título</h2> <p>Esto es otro parrafo</p> </body> </html>
Aquí la estructura XML de CDA (Clinical Document Architecture) resumida con cuerpo estructurado (archivo “SampleCDADocument.xml” )
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="CDA.xsl"?> <ClinicalDocument> <!-- comienza la cabecera //--> <typeId root="2.16.840.1.113883.1.3" extension="POCD_HD000040"/> <templateId root="2.16.840.1.113883.3.27.1776"/> <id extension="c266" root="2.16.840.1.113883.19.4"/> <title>Good Health Clinic Consultation Note</title> <effectiveTime value="20000407"/> <confidentialityCode code="N" codeSystem="2.16.840.1.113883.5.25"/> <languageCode code="en-US"/> <setId extension="BB35" root="2.16.840.1.113883.19.7"/> <versionNumber value="2"/> <!-- más nodos de cabecera... //--> <!-- comienza el cuerpo //--> <component> <structuredBody> <component> <section> <code code="10164-2" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/> <title>History of Present Illness</title> <text> <content styleCode="Bold">Henry Levin, the 7<sup>th</sup> </content> is a 67 year old male referred for further asthma management. Onset of asthma in his <content revised="delete">twenties</content> <content revised="insert">teens</content>. He was hospitalized twice last year, and already twice this year. He has not been able to be weaned off steroids for the past several months. </text> </section> </component> <!-- más component en cuerpo //--> </structuredBody> </component> </ClinicalDocument>
1.2 Diferencia entre Cuerpo Estructurado y no Estructurado
Estructurado
<ClinicalDocument> <!-- cabecera y //--> <!-- comienzo de cuerpo //--> <component> <structuredBody> <component> <section> <text> <content></content> </text> </section> </component> </structuredBody> </component> </ClinicalDocument>
No Estructurado
<ClinicalDocument> <!-- cabecera y //--> <!-- comienzo de cuerpo //--> <component> <nonXMLBody> <text mediaType="" ></text> <reference value=""/> </nonXMLBody> </component> </ClinicalDocument>
Hurgando en el archivo de definición de esquema XML, el XSD “POCD_MT000040.xsd”
La linea 222 declara el nodo “<component>” que está en la definición de “<ClinicalDocument>” y del que es hijo que comprende las líneas 194 ~ 227, hay otro nodo con el mismo nombre “<component>” pero hijo de “<structuredBody>” al que se declara en la linea 1255 :
<xs:element name="component" type="POCD_MT000040.Component2"/>
La linea 238 ~ 251 define a “<component>” a traves del tipo “POCD_MT000040.Component2”
<xs:complexType name="POCD_MT000040.Component2"> <xs:sequence> <xs:element name="realmCode" type="CS" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="typeId" type="POCD_MT000040.InfrastructureRoot.typeId" minOccurs="0"/> <xs:element name="templateId" type="II" minOccurs="0" maxOccurs="unbounded"/> <xs:choice> <xs:element name="nonXMLBody" type="POCD_MT000040.NonXMLBody"/> <xs:element name="structuredBody" type="POCD_MT000040.StructuredBody"/> </xs:choice> </xs:sequence> <xs:attribute name="nullFlavor" type="NullFlavor" use="optional"/> <xs:attribute name="typeCode" type="ActRelationshipHasComponent" use="optional" fixed="COMP"/> <xs:attribute name="contextConductionInd" type="bl" use="optional" fixed="true"/> </xs:complexType>
- En xs:sequence vemos que puede aparecer, los siguientes elementos (xs:element) en esta secuencia (todos con minOccurs=0 osea son opcionales y dos con maxOccurs=“unbounded” osea pueden repetirse ilimitadamente):
- realmCode
- typeId
- templateId
- En xs:choice podemos ver que luego de “<component>” se puede declarar “<nonXMLBody>” o “<structuredBody>”
- En xs:attribute los atributos “nullFlavor”, “typeCode” y “contextConductionInd” todos con use=“optional”
Cuerpo Estructurado : <structuredBody>
ClinicalDocument > component > structuredBody > component > section > entry : code : title : text
Definicion en Linea 1248
<xs:complexType name="POCD_MT000040.StructuredBody"> <xs:sequence> <xs:element name="realmCode" type="CS" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="typeId" type="POCD_MT000040.InfrastructureRoot.typeId" minOccurs="0"/> <xs:element name="templateId" type="II" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="confidentialityCode" type="CE" minOccurs="0"/> <xs:element name="languageCode" type="CS" minOccurs="0"/> <xs:element name="component" type="POCD_MT000040.Component3" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="nullFlavor" type="NullFlavor" use="optional"/> <xs:attribute name="classCode" type="ActClass" use="optional" fixed="DOCBODY"/> <xs:attribute name="moodCode" type="ActMood" use="optional" fixed="EVN"/> </xs:complexType>
Cuerpo No Esctructurado : <nonXMLBody>
ClinicalDocument > component > nonXMLBody > text : reference
Definición en linea 722 :
<xs:complexType name="POCD_MT000040.NonXMLBody"> <xs:sequence> <xs:element name="realmCode" type="CS" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="typeId" type="POCD_MT000040.InfrastructureRoot.typeId" minOccurs="0"/> <xs:element name="templateId" type="II" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="text" type="ED"/> <xs:element name="confidentialityCode" type="CE" minOccurs="0"/> <xs:element name="languageCode" type="CS" minOccurs="0"/> </xs:sequence> <xs:attribute name="nullFlavor" type="NullFlavor" use="optional"/> <xs:attribute name="classCode" type="ActClass" use="optional" fixed="DOCBODY"/> <xs:attribute name="moodCode" type="ActMood" use="optional" fixed="EVN"/> </xs:complexType>
Detalles de Elementos de encabezado
Verificar el cumplimiento de los elementos mínimos en la cabecera:
<?xml version="1.0"?> <!-- To use the impl_cdar2.xls stylesheet, remove the comment delimiters from the style sheet call below. --> <?xml-stylesheet type="text/xsl" href="IMPL_CDAR2.xsl"? --> <ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:voc="urn:hl7-org:v3/voc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 CDA.xsd"> <!-- ******************************************************** CDA Header ******************************************************** --> <typeId root="2.16.840.1.113883.1.3" extension="POCD_HD000040"/> <id extension="" root=""/> <code code="" codeSystem=""/> <effectiveTime value=""/> <confidentialityCode code="" codeSystem=""/> <recordTarget> <patientRole> <id extension="" root=""/> <patient> <name> <given></given> <family></family> <suffix></suffix> </name> <administrativeGenderCode code="" codeSystem=""/> <birthTime value=""/> </patient> <providerOrganization> <id root=""/> <name></name> </providerOrganization> </patientRole> </recordTarget> <author> <time value=""/> <assignedAuthor> <id extension="" root=""/> <assignedPerson> <name> <given></given> <family></family> <suffix></suffix> </name> </assignedPerson> <representedOrganization> <id root=""/> <name></name> </representedOrganization> </assignedAuthor> </author> <custodian> <assignedCustodian> <representedCustodianOrganization> <id root=""/> <name></name> </representedCustodianOrganization> </assignedCustodian> </custodian> <!-- ******************************************************** CDA Body ******************************************************** --> <component> <nonXMLBody> <text mediaType="" ></text> <reference value=""/> </nonXMLBody> </component> </ClinicalDocument>
| Elementos de cabecera de CDA | |
|---|---|
| Elemento de Cabecera | Exigencia |
| typeId | Requerido |
| id | Requerido |
| code | Requerido |
| title | Requerido |
| effectiveTime | Requerido |
| confidentialityCode | Requerido |
| languageCode | Opcional |
| setId | Opcional |
| versionNumber | Opcional |
| recordTarget | Requerido |
| author | Requerido |
| dataEnterer | Opcional |
| informant | Opcional |
| custodian | Requerido |
| informationRecipient | Opcional |
| legalAuthenticator | Opcional |
| authenticator | Opcional |
| participant | Opcional |
| inFulfillmentOf | Requerido |
| documentationOf | Opcional |
| relatedDocument | Opcional |
| authorization | Opcional |
| componentOf | Opcional |
Analizando la cabecera
También son elementos requeridos “<clinicalDocument>“ y ”<component>“ con los nodos hijos ”<structuredBody>“ o ”<nonXMLBody>”
ClinicalDocument (Requerido)
- xmlns (Requerido)
- xmlns:voc (Requerido)
- xmlns:xsi (Requerido)
- xsi:schemaLocation (Requerido)
<?xml version="1.0"?> <!-- To use the impl_cdar2.xls stylesheet, remove the comment delimiters from the style sheet call below. --> <?xml-stylesheet type="text/xsl" href="IMPL_CDAR2.xsl"? --> <ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:voc="urn:hl7-org:v3/voc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 CDA.xsd">
Pero concentrándose en la cabecera:
typeId (Requerido)
- root (Requerido)
- extension (Requerido)
<typeId root="2.16.840.1.113883.1.3" extension="POCD_HD000040"/>
id (Requerido)
- root (Requerido)
- extension (Requerido)
<id root="" extension=""/>
code (Requerido)
- code (Requerido)
- codeSystem (Requerido)
- codeSystemName (Opcional)
- displayName= (Opcional)
<code code="" codeSystem=""/>
effectiveTime (Requerido)
- value (Requerido)
<effectiveTime value=""/>
confidentialityCode (Requerido)
- code (Requerido)
- codeSystem (Requerido)
<confidentialityCode code="" codeSystem=""/>
recordTarget (Requerido)
- Nodo: patientRole (Requerido)
- Nodo: id (Requerido), Parámetro: extension (Requerido), Parámetro: root (Requerido)
- Nodo: Patient (Opcional)
- Nodo: Name (Opcional)
- Nodo: Given (Opcional)
- Nodo: Family (Opcional)
- Nodo: suffix (Opcional)
- Nodo: administrativeGenderCode (Opcional), Parámetro: code (Requerido), Parámetro: codeSystem (Requerido)
- Nodo: birthTime (Opcional), Parámetro: value (Requerido)
- Nodo: providerOrganization (Opcional)
- Nodo: id (Opcional), Parámetro: root (Requerido)
- Nodo: name (Opcional)
Los Parámetros marcados como requeridos en los nodos Opcionales, se refieren que los parámetros son obligatorios para ese nodo más no que el nodo sea obligatorio para la declaración mínima necesaria del HL7v3 CDA
<recordTarget> <patientRole> <id extension="" root=""/> <patient> <name> <given></given> <family></family> <suffix></suffix> </name> <administrativeGenderCode code="" codeSystem=""/> <birthTime value=""/> </patient> <providerOrganization> <id root=""/> <name></name> </providerOrganization> </patientRole> </recordTarget>
author (Requerido)
- Nodo: time (Requerido), Parámetro: value (Requerido);
- Nodo: assignedAuthor (Requerido)
- Nodo: id (Requerido), Parámetro: extension (Requerido), Parámetro: root (Requerido)
- Nodo: assignedPerson (Opcional)
- Nodo: name (Opcional)
- Nodo: given (Opcional)
- Nodo: family (Opcional)
- Nodo: suffix (Opcional)
- Nodo: representedOrganization (Opcional)
- Nodo: id (Opcional), Parámetro: id (Requerido)
- Nodo: name (Opcional)
<author> <time value=""/> <assignedAuthor> <id extension="" root=""/> <assignedPerson> <name> <given></given> <family></family> <suffix></suffix> </name> </assignedPerson> <representedOrganization> <id root=""/> <name></name> </representedOrganization> </assignedAuthor> </author>
custodian (Requerido)
- Nodo: assignedCustodian (Requerido)
- Nodo: representedCustodianOrganization (Requerido)
- Nodo: id (Requerido), parametro: root (Requerido)
- Nodo: mame (Opcional)
<custodian> <assignedCustodian> <representedCustodianOrganization> <id root=""/> <name></name> </representedCustodianOrganization> </assignedCustodian> </custodian>
Viendo también el cuerpo, que es del tipo no estructurado <nonXMLBody> :
component (Requerido)
- Nodo: nonXMLBody (Requerido)
- Nodo: text (Requerido), Parámetro: mediaType (Requerido)
- Nodo: reference (Requerido) Parámetro: value (Requerido)
<component> <nonXMLBody> <text mediaType="" ></text> <reference value=""/> </nonXMLBody> </component>
Buscar los elementos en el archivo CDA con elementos mínimos
Elemento <typeId>
El elemento typeId aparece en la línea 10 del archivo “EmptyMinimalCDAnonXMLbody.xml”
<typeId root="2.16.840.1.113883.1.3" extension="POCD_HD000040"/>
Elemento <id>
puse de root el OID que se asigno para el ejemplo, en extensión puse un correlativo
<id root="2.16.840.1.113883.19.604" extension="HNDAC20140520-001">
Elemento <code>
Este ejemplo se refiere al plan de tratamiento psiquiátrico:
<code code="18594-2" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Plan de Rehabilitación Siquiatrica" />
Modifico para expresar una nota de “consulta pediátrica”, busque en http://search.loinc.org/ la consulta pediátrica en Ingles:
| LOINC | NombreCompleto | Componente |
|---|---|---|
| 68892-9 | Pediatric dermatology Hospital Consult note | Consultation note |
<code code="68892-9" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Nota de Consulta de Dermatología Pediátrica" />
o en otro caso, modifico para declarar una “consulta gineco-obstétrica”
| LOINC | NombreCompleto | Componente |
|---|---|---|
| 68566-9 | Obstetrics and Gynecology Hospital Consult note | Consultation note |
<code code="68566-9" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Nota de Consulta de Ginecología Obstétrica" />
El OID : 2.16.840.1.113883.6.1 hace referencia a que se utilizará un código LOINC como se lo explica aquí:
http://www.hl7.org/oid/index.cfm?Comp_OID=2.16.840.1.113883.6.1
http://loinc.org/oids/2.16.840.1.113883.6.1
Elemento <title>
<title>Psychiatric Rehabilitation Attachment</title>
Como se pide en Lenguaje Natural
<title>Nota de Consulta Gineco-Obstétrica</title>
Elemento <effectiveTime>
<effectiveTime value="20110308" />
El momento en que creo el archivo XML CDA
año + mes + día + hora + minuto + segundo + horario local
2014/05/20/15:30:00/UTC-05:00 (zona horaria)
año, mes y día son obligatorios, como se ve en el ejemplo de arriba
<effectiveTime value="20140520153000-0500" />
Elemento <confidentialityCode>
Confidencialidad restringida : acceso normal
<confidentialityCode code="N" codeSystem="2.16.840.1.113883.5.25" codeSystemName="Confidentiality" displayName="Normal" />
Confidencialidad restringida: acceso restringido
<confidentialityCode code="R" codeSystem="2.16.840.1.113883.5.25"/>
Confidencialidad muy restringida: acceso muy restringido
<confidentialityCode code="V" codeSystem="2.16.840.1.113883.5.25"/>
Modifico el archivo CDA a Acceso Restringido, las etiquetas “codeSystemName” y “displayName” son Opcionales:
<confidentialityCode code="R" codeSystem="2.16.840.1.113883.5.25" codeSystemName="Confidentiality" displayName="Restringido" />
Elemento <languageCode>
Este elemento de la cabecera es opcional
<languageCode code="es-CO"/>
Se cambio según como se muestra aquí, con el código para Perú :
<languageCode code="es-PE"/>
Elemento <versionNumber>
Elemento opcional que tiene por parámetro un número entero que se usa para identificar la sucesivas versiones del documento.
<versionNumber value="1.0"/>
Elemento <recordTarget>
Elemento obligatorio que indica a quien pertenece y hace referencia el documento:
<recordTarget> <patientRole> <id extension="76325018" root="22.16.840.1.113883.4.330.170" /> <patient> <name> <given>Diego</given> <given>Mauricio</given> <family>López</family> <family>Gutiérrez</family> </name> <administrativeGenderCode code="M" codeSystem="2.16.840.1.113883.5.1" codeSystemName="AdministrativeGender" displayName="Male" /> <birthTime value="19761122" /> </patient> </patientRole> </recordTarget>
Normalmente una persona pero en casos especiales, un feto o un grupo de personas.
“RecordTarget” como podemos ver en la línea 208 del archivo de definición de esquema XSD (POCD_MT000040.xsd) está declarado con maxOccurs=“unbounded” eso significa que la etiqueta es válida en ser declarada en más de una ocasión.
<xs:element name="recordTarget" type="POCD_MT000040.RecordTarget" maxOccurs="unbounded"/>
En el ejercicio se pide reemplazar los datos del ejemplo, aquí el ejemplo desarrollado con los datos pedidos en el PDF del taller
<?xml version="1.0"?> <recordTarget> <patientRole> <id extension="01020304" root="2.16.840.1.113883.19.604.10.1" /> <patient> <name> <given>CARLOS</given> <given>ANDRÉS</given> <family>GUZMAN</family> <family>DIAZ</family> </name> <administrativeGenderCode code="M" codeSystem="2.16.840.1.113883.5.1" codeSystemName="AdministrativeGender" displayName="Masculino" /> <birthTime value="19760706" /> <addr> <streetAddressLine>Jr blablabla 1234</ streetAddressLine > <streetAddressLine>Los Pescadores</ streetAddressLine > <city>La Perla</city> <postalCode>004</postalCode> <state>Callao</state> <country>Perú</country> </addr> <telecom value="tel:+15556755745” use="WP"/> <telecom value="tel:+15556755745; provider-tag=C" use="WP"/> <telecom value=”mailto:user@hostname" use="H"/> <birthplace> <place> <streetAddressLine>Av. blablabla 1234</ streetAddressLine > <streetAddressLine>Las blablabla</ streetAddressLine > <city>San Isidrio</city> < postalCode>005</postalCode> <state>Lima</state> <country>Peru</country> </place> </birthplace> <maritalStatusCode code="M" displayName="Casado" codeSystem="2.16.840.1.113883.5.2" codeSystemName="MaritalStatusCode"/> <effectiveTime value="20050329171504+0500"/> </patient> </patientRole> </recordTarget>
Datos interesantes sobre telefonia:
http://www.ietf.org/rfc/rfc2806.txt
Elemento <author>
Ejemplo:
<author contextControlCode="OP" typeCode="AUT" > <time value="2000040714"/> <assignedAuthor> <id extension="KP00017" root="2.16.840.1.113883.19.5"/> <assignedPerson> <name> <given>Francisco</given> <family>Alonso</family> <family>García</family> </name> </assignedPerson> <representedOrganization> <id root="2.16.840.1.113883.19.xx"/> <name>Hospital La Caridad</name> </representedOrganization> </assignedAuthor> </author>
Desarrollandolo con otros datos:
<author contextControlCode="OP" typeCode="AUT" > <time value="20061025" /> <assignedAuthor classCode="ASSIGNED" > <id extension="298379" root="2.16.840.1.113883.19.2744.1.3" /> <assignedPerson> <name> <given>Miguel</given> <family>Flores</family> <family>Martinez/family> </name> </assignedPerson> <representedOrganization> <id root="2.16.840.1.113883.19.xx"/> <name>Hospital Daniel Alcidez Carrión</name> </representedOrganization> </assignedAuthor> </author>
Elemento <custodian>
<custodian> <assignedCustodian> <representedCustodianOrganization> <id root="2.16.840.1.113883.19.5"/> <name>Nombre del Hospital</name> </representedCustodianOrganization> </assignedCustodian> </custodian>
cambiandole solo el name
<custodian> <assignedCustodian> <representedCustodianOrganization> <id root="2.16.840.1.113883.19.5"/> <name>Hospital Daniel Alcidez Carrión</name> </representedCustodianOrganization> </assignedCustodian> </custodian>
Cuerpo del CDA
No Estructurado, elemento <nonXMLBody>
<component> <nonXMLBody> <text mediaType="texto plano"> <reference value="paciente.txt"/> </text> </nonXMLBody> </component>
Desarrollando el ejemplo, para un archivo PDF de nombre “HistoriaClinica12345678.pdf”:
<component> <nonXMLBody> <text mediaType="application/pdf"> <reference value="HistoriaClinica12345678.pdf"/> </text> </nonXMLBody> </component>
Estructurado, elemento <structuredBody>
<component> <structuredBody> <component> <section> <code code="10164-2" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/> <title>Anamnesis</title> <text> <content> El paciente presenta… </content>. </text> </section> </component> </structuredBody> </component>
Entry
<entry> <observation classCode="OBS" moodCode="EVN"> <code code="301333006" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT" displayName="medidas de peso corporal - hallazgo"/> <effectiveTime value="200004071430"/> <value xsi:type="PQ" value="93" unit="kg"/> </observation> </entry>
