Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

Implemente um aplicativo de assistência médica no lado do cliente usando o Saxon-CE e o HL7 CDA

Use o XSLT 2.0 no navegador para aprimorar as exibições de documentos clínicos

Piers Michael Hollott, Senior Consultant, Sierra Systems
Piers trabalha no segmento de mercado de software há 15 anos e é especialista em desenvolvimento Java, tecnologias XML e programação funcional. Contribuiu com vários projetos de software livre, e atualmente é consultor da Sierra Systems.

Resumo:  Na conferência de 2011 sobre XML em Praga, Dr. Michael Kay, o principal desenvolvedor do analisador Saxon XSL/XQuery, revelou o Saxon-CE, um analisador XSLT 2.0 do lado do cliente que é executado usando JavaScript no navegador da Web. Saiba como é possível usar o XSLT 2.0 e o Saxon-CE para criar uma exibição de aplicativo para um aplicativo simples de assistência médica que funciona de um documento clínico escrito usando o Health Level 7 Clinical Document Architecture (HL7 CDA).

Data:  06/Out/2011
Nível:  Intermediário Também disponível em :   Inglês
Atividade:  526 visualizações
Comentários:  


Acrônimos usados frequentemente

  • CSS: folhas de estilo em cascata
  • DOM: Modelo de Objeto de Documento
  • HTML: Linguagem de Marcação de Hipertexto
  • URL: Interface com o usuário
  • XHTML: HTML extensível
  • XML: linguagem de marcação extensível
  • XSL: linguagem de folha de estilo extensível
  • XSLT: transformação de linguagem de folha de estilo extensível

O Health Level 7 (HL7) Clinical Document Architecture (CDA) tem base no mesmo Modelo de informações de referência da versão 3 do HL7, usado para desenvolver interações para envio de mensagens do HL7 v3. Enquanto as mensagens do HL7 representam interações individuais de assistência médica (como consultas, respostas e notificações), um documento HL7 CDA é um documento único, persistente que representa uma visita ao paciente, um documento de continuidade de tratamento e coisas do gênero. Para tornar as entradas em um CDA legíveis para as pessoas, cada uma tem uma descrição em texto, além de qualquer conteúdo lido por máquina, como mostra a Listagem 1. As mensagens do HL7 v3 são, no sentido exato, transmitidas por cabo (por exemplo, como parte de uma interação cliente-servidor ou distribuição de dados servidor-servidor). Como elas também precisam ser lidas por humanos, os documentos do HL7 CDA podem ser transferidos por outros meios, como e-mail.


Listagem 1. Uma entrada de observação no CDA: alergia à penicilina

<component>
    <section>
        <code code="10155-0" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/>
        <title>Allergies and Adverse Reactions</title>
        <text>
            <list>
                <item>Penicillin - Hives</item>
            </list>
        </text>
        <entry>
            <observation classCode="OBS" moodCode="EVN">
                <code xsi:type="CD" code="247472004" codeSystem="2.16.840.1.113883.6.96"
                    codeSystemName="SNOMED CT" displayName="Hives"/>
                <statusCode code="completed"/>
                <entryRelationship typeCode="MFST">
                    <observation classCode="OBS" moodCode="EVN">
                        <code xsi:type="CD" code="91936005"
                            codeSystem="2.16.840.1.113883.6.96"
                            codeSystemName="SNOMED CT"
                            displayName="Allergy to penicillin"/>
                        <statusCode code="completed"/>
                    </observation>
                </entryRelationship>
            </observation>
        </entry>
    </section>
</component>

Há vários anos, o analisador Saxon suporta transformações de XSLT 2.0 no lado do servidor. Recentemente, na conferência de 2011 sobre XML em Praga, Dr. Michael Kay, que escreveu o analisador Saxon original, apresentou uma versão alfa do Saxon Client Edition (Saxon-CE), que permite a execução de transformações de XSLT 2.0 diretamente do aplicativo cliente da Web (no navegador). O Saxon-CE usa JavaScript para executar em qualquer navegador moderno, o que tem sido um problema contínuo com XSL no lado do cliente. Historicamente, o suporte a XSL não foi implementado de forma consistente pelos diferentes navegadores. Como ele usa JavaScript como um mecanismo de tempo de execução, o Saxon-CE resolve esse problema.

Além disso, o XSLT 2.0 fornece vários recursos que não eram suportados na especificação XSLT 1.0 original, como o suporte para diversos documentos e digitação de dados mais sólida. Com o Saxon-CE, esses recursos são suportados no cliente, e, como este artigo demonstra, alguns desses recursos são adequados para uso em exibições do aplicativo do cliente—em particular, no suporte no lado do cliente para diversos documentos.

Introdução

Para desenvolver o aplicativo CDA Viewer descrito neste artigo, eu usei o servidor da Web Unite que vem embalado com a versão mais recente do Opera. É possível usar qualquer servidor de aplicativos que preferir. Como estou descrevendo como desenvolver uma exibição de aplicativo cliente, eu não descrevo como o documento CDA é persistido ou distribuído. Para testar a exibição de aplicativo, eu simplesmente publico um exemplo de CDA como uma URL diretamente pelo servidor da Web (como alternativa, é possível persistir em um banco de dados XML como o IBM® DB2® pureXML). Da mesma forma, minhas transformações XSL são publicadas como URLs.

Fazendo o download do Saxon-CE

A versão alfa do Saxon-CE está atualmente disponível para download no site da Saxonica (consulte Recursos para obter um link). Essa versão alfa não é destinada a aplicativos de produção no momento, no entanto, com base no sucesso do analisador Saxon original, não há dúvidas de que o Client Edition também se tornará rapidamente um padrão do segmento, especialmente se receber um feedback positivo dos primeiros usuários.

A versão alfa vem com notas de versão abrangentes. É possível copiar os arquivos JavaScript contidos na pasta de versão descompactada para seu servidor de aplicativos, como você faria com qualquer outro script .js. Também reserve um tempo para fazer o download dos aplicativos de exemplo. O JavaScript é composto por um único arquivo .nocache.js junto com um número de arquivos .js reduzido—, um para cada navegador principal. Esses arquivos contêm o código do analisador; o arquivo .nocache.js detecta qual navegador está sendo usado e chama o script .js apropriado. Os exemplos de aplicativo são compostos por um arquivo de transformação XSL, alguns dados XML e um arquivo HTML que chama o JavaScript do Saxon-CE para executar a transformação. O aplicativo CDA Viewer criado segue o mesmo padrão, embora a camada de transformação tenha sido dividida em três arquivos para melhorar a legibilidade (consulte Download). Em meu servidor da Web, há uma pasta para cada um dos exemplos de aplicativo e outra para meu aplicativo CDA.


Explorando os recursos no XSLT 2.0

Muitos recursos foram introduzidos na especificação XSLT 2.0—recursos como definições de função, diversos documentos de resultado, sequências e árvores temporárias, digitação mais sólida e análise de texto. Este artigo destaca o suporte para diversos documentos de resultado. No lado do servidor, usar diversos documentos de resultado significa criar diversos documentos no servidor, de modo que você possa criar uma página inicial XHTML que faz referência a diversas outras páginas de resultado, todas geradas no servidor. No contexto da transformação no lado do servidor, o uso de diversos documentos de resultado significa apenas isso: diversos documentos. A Listagem 2 demonstra essa abordagem. Quando você gera diversos documentos no lado do cliente usando o Saxon-CE, o conteúdo gerado é destinado a diferentes áreas da tela de seu aplicativo cliente (tipicamente, elementos div na página HTML).


Listagem 2. Diversos documentos de resultado (no servidor)

<xsl:for-each select="section">
    <xsl:result-document href="{@id}.html">
        <xsl:apply-templates select="." mode="html" />
    </xsl:result-document>
</xsl:for-each>


Transformando o documento clínico

Organizei minhas transformações XSL em três arquivos (consulte Download):

  • cda.xsl. Contém a transformação básica para exibir o documento legível
  • cda-machine-readable.xsl. Contém uma camada personalizável que exibe atualmente os detalhes do documento lidos por máquinas de uma maneira mais organizada
  • cda-dom-interaction.xsl. Contém modelos que lidam com interações com a página DOM do HTML, como eventos de clique

Além disso, há um arquivo CSS e a própria página HTML.

O CSS é direto. A página HTML é direta da mesma forma, contendo um número de elementos div para as diferentes áreas da tela do CDA Viewer, cada um posicionado por um ID no CSS. O plano é carregar todo o CDA e transformá-lo e, em seguida, permitir o acesso interativo por meio do DOM de modo que o elemento div seja chamado div-cache, escondo na parte inferior do visualizador. Esse cache contém uma cópia das entradas registradas no CDA. É possível rolar a tela para baixo e ver esse texto, ou ocultar esse elemento marcando-o style="visibility:hidden;inline:none".

O código na Listagem 3 aciona o processo de transformação. Como é possível ver, as tags <script> chamam primeiro o JavaScript do Saxon-CE e, em seguida, a folha de estilo de transformação XSL, visando o documento CDA.


Listagem 3. Chamando o Saxon-CE da página HTML

<script type="text/javascript" language="javascript" src="../Saxonce.nocache.js"></script>
<script type="application/xslt+xml" language="xslt2.0" src="cda.xsl"
                      input="SampleCDADocument.xml"></script>

Exibindo o índice do CDA Viewer

Na Listagem 3, a principal transformação cria primeiro um cabeçalho simplificado para o CDA Viewer extraindo algumas das informações do wrapper do CDA. Agora, é possível ver xsl:result-document em ação. Na Listagem 4, perceba como a tag <div> é prevista por seu ID #creation . method="ixsl:replace-content" é a abreviação de Saxon-CE para "no XSL interativo, substitua o conteúdo". Você verá um exemplo no momento de anexar o conteúdo. Perceba que quando você lida diretamente com o CDA, é necessário usar o namespace hl7: sempre que você se referir a um elemento no CDA. Você verá mais tarde que isso não é necessário quando lida com modelos que fazem referência ao DOM. Esse processo pode ser complicado e esse é um motivo pelo qual os modelos foram separados em várias folhas de estilo XSL.


Listagem 4. Substituindo o conteúdo por xsl:result-document

<xsl:result-document href="#creation" method="ixsl:replace-content">
    <div>
        <xsl:value-of>
            <xsl:value-of select="hl7:ClinicalDocument/hl7:title"/>:
            <xsl:value-of
              select="hl7:ClinicalDocument/hl7:recordTarget/hl7:patientRole/hl7:patient"/>
        </xsl:value-of>
    </div>
</xsl:result-document>

Na próxima parte do código de mesmo arquivo XSL (consulte Listagem 5), é possível ver como o índice do CDA Viewer é gerado a partir das seções no documento CDA. Observe os arquivos de exemplo fornecidos para obter detalhes sobre como o índice é formatado. Uma abordagem parecida é usada para armazenar em cache os dados de entrada clínica do CDA. Em ambos os casos, é possível ver como os resultados são anexados ao conteúdo existente do elemento <div> de destino, sempre que o modelo for aplicado.


Listagem 5. Anexando conteúdo com o xsl:result-document

<xsl:result-document href="#notes" method="ixsl:append-content">
    <xsl:apply-templates select="//hl7:component/hl7:section" mode="notes"/>
</xsl:result-document>

<xsl:result-document href="#div-cache" method="ixsl:append-content">
    <xsl:apply-templates select="//hl7:component/hl7:section" mode="cache"/>
</xsl:result-document>

Figura 1 mostra o CDA Viewer básico e o índice.


Figura 1. O índice do CDA Viewer

Interagindo com o DOM

IDs gerados são usados para conectar links no índice para as entradas do CDA armazenados em cache. Listagem 6 fornece um trecho do modelo usado para criar uma entrada no índice.


Listagem 6. Criando um vínculo com a entrada CDA armazenada em cache

<a class="notes-section">
    <xsl:attribute name="id"><xsl:value-of select="generate-id(.)"/></xsl:attribute>
    <xsl:value-of select="hl7:title"/>
</a>

Na Listagem 7, perceba como o atributo mode="ixsl:onclick" no modelo é usado para informar ao Saxon-CE que aplique esse modelo para lidar com um evento de clique. Isso não é diferente de qualquer outro evento de clique do JavaScript: Ele é simplesmente manipulado pelo Saxon-CE e pela folha de estilo XSL. Observe que sempre que o analisador lida com um evento de clique como esse, o contexto muda do documento XML original para o DOM da página HTML e, por isso, esses modelos foram separados em uma folha de estilo de transformação chamada cda-dom-interaction.xsl. O próprio modelo exibe o texto da entrada CDA, extraído do cache criado anteriormente usando o ID associado ao evento de clique original (o ID do link de âncora original). Este texto substitui o conteúdo no documento de resultados note-detail do elemento div. Em seguida, o modelo aplica quaisquer modelos de downstream aplicáveis para lidar com o conteúdo lido por máquinas na entrada CDA.


Listagem 7. Lidando com um evento de clique do índice

<xsl:template match="a[@class='notes-section']" mode="ixsl:onclick">
    <xsl:variable name="div-id" select="@id"/>
    <xsl:variable name="selected-section"
        select="//div[@id='div-cache']/div[@id=$div-id]/section"/>

    <xsl:result-document href="#note-detail" method="ixsl:replace-content">
        <h2><xsl:value-of select="$selected-section/title/text()"/>
            (<xsl:value-of select="$div-id"/>)</h2>
        <div><xsl:value-of select="$selected-section/text"/></div>
        <h2>Machine-readable Content</h2>
        <xsl:apply-templates select="$selected-section" mode="mach-read">
            <xsl:with-param name="a" select="."/>
        </xsl:apply-templates>
    </xsl:result-document>
</xsl:template>

Para manter as questões de legibilidade por máquina e por humano separadas, foi criada e incluída uma terceira folha de estilo de transformação chamada cda-machine-readable.xsl. Manter esses modelos separados tem a vantagem de que essa terceira folha de estilo pode ser estendida ou completamente substituída para usar uma folha de estilo mais sofisticada para lidar com as informações legíveis por máquinas no CDA. Talvez você queira fazer isso, por exemplo, para fornecer tabelas mais incrementadas ou representações gráficas dos dados ou para reter determinados tipos de entradas. Como alternativa, talvez você queira ir mais fundo e carregar outro documento XML, talvez de um repositório de metadados, e expandir alguns dos códigos dentro dos dados legíveis por máquina ou categorizá-los usando sistemas de código comuns. Impedir os modelos de transformar entradas legíveis por máquinas é uma boa prática de programação, assim como a separação das questões em geral. Considero essa prática essencial ao lidar com transformações de larga escala ou aquelas que eu espero que cresçam.

Exibindo entradas clínicas legíveis por máquinas

Minha folha de estilo minimalista de transformação legível por máquina contém um único modelo que identifica vários tipos de entradas (eventos de Observação, Administração de substância, Procedimento e Ação) e estilos conhecidos e usa listas com marcadores e tabelas. Não tentei realizar nada muito sofisticado aqui, mas é um exercício útil observar como um modelo simples pode fornecer um retorno substancial em estilo e organização. Perceba também como na Listagem 8 o link de âncora originador é passado para o modelo usando um parâmetro. Essa etapa não exige a exibição dos dados legíveis por máquina. Em vez disso, o link é passado por esse modelo e armazenado em cache para uso posterior em um elemento div oculto na parte inferior do detalhe da entrada. As informações desse link serão usadas depois para criar o que é chamado de uma área de fixação. Em nome da brevidade, tudo foi omitido, com exceção de xsl:when para Observação em xsl:choose.


Listagem 8. Moldando as entradas CDA legíveis por máquina

<xsl:template match="section" mode="mach-read">
    <xsl:param name="a"/>

    <div id="mach-read">
        <xsl:choose>
            <xsl:when test="entry/observation">
                <h3>Observations</h3>
                <ul>
                    <xsl:for-each select="entry/observation">
                        <li><a>
                            <xsl:value-of select="text"/>
                            <xsl:value-of select="code/@displayName"/>
                            <xsl:for-each select="value">
                            (<xsl:value-of><xsl:value-of select="@value"/>
                                <xsl:value-of select="@unit"/></xsl:value-of>)
                            </xsl:for-each>
                        </a></li>
                    </xsl:for-each>			
                </ul>
            </xsl:when>
            <xsl:otherwise>(no match)</xsl:otherwise>
        </xsl:choose>
        <div class="xref" style="visibility:hidden;inline:none">
            <xsl:copy-of select="$a"/>
        </div>
    </div>
</xsl:template>

Perceba que, como esse modelo é aplicado a uma cópia dos dados CDA originais armazenados em cache no DOM, o hl7: não é exigido para elementos como entry, code e observation. Se você quiser, será possível adicionar esse namespace às entradas CDA armazenadas em cache, mas há pouco benefício em fazer isso, pois nenhuma serialização adicional será realizada. Se houver qualquer ambiguidade entre os elementos HL7 CDA e outros elementos na página, fazer isso seria considerado pragmático.

Figura 2 mostra o CDA Viewer exibindo um evento de observação representando alergias e reações adversas.


Figura 2. Eventos de observação, como alergias e reações adversas


Desenvolvendo um novo padrão de design: a área de fixação

A área de fixação é um padrão de design que surgiu durante o desenvolvimento dessas transformações, inspirada pela forma que o Saxon-CE implementa os documentos resultantes do XSLT 2.0. Como foi descrito anteriormente, o conteúdo gerado pode ser anexado a uma área da tela ou pode substituir um conteúdo existente. Normalmente, convém substituir o conteúdo existente, no entanto, quando você estiver aplicando um modelo repetidamente, convém anexar o conteúdo. Se você aplicar vários modelos à mesma área da tela de destino, será possível criar uma coleção que lembra um marcador. É possível adicionar interativamente a essa coleção sem remover qualquer conteúdo existente na área da tela.

No exemplo de código na Listagem 9, observe o modelo para fixar links de âncora. É claro que este é um exemplo de aplicativo, mas a ideia aqui é intrigante. Ao clicar no link do índice do Viewer, o evento de clique é manipulado, exibindo o conteúdo dessa seção do CDA. Ao clicar em qualquer outro link, no entanto, um simples modelo de âncora lida com o evento de link e copia o conteúdo do link na área de fixação. Como resultado, é possível usar o Viewer para alternar entre os conteúdos do documento clínico e "fixar" entradas para referência posterior.


Listagem 9. Moldando a área de fixação

<xsl:template match="a" mode="ixsl:onclick">
    <xsl:variable name="div-mach-read" select="ancestor::div[@id='mach-read']"/>
    <xsl:result-document href="#pin" method="ixsl:append-content">
        <div>
            <xsl:attribute name="title"><xsl:value-of select="$div-mach-read/h3"/>
            - <xsl:value-of select="text()"/></xsl:attribute>
            <xsl:copy-of select="$div-mach-read/div[@class='xref']/a"/> -
            <xsl:value-of select="text()"/>
        </div>
    </xsl:result-document>
</xsl:template>

Figura 3 mostra a área de fixação em uso.


Figura 3. A área de fixação do CDA Viewer

Os benefícios desse padrão de design aumentarão, é claro, se você puder fazer algo útil com as entradas fixadas, no entanto, essa discussão ultrapassa o escopo deste artigo. Um possível caso de uso pode envolver um plug-in para um navegador de e-mail que permite a um paciente exibir um CDA recebido do profissional, fixar algumas entradas e colocá-las em uma resposta de e-mail. Como eles lidam com as informações de forma declarada, o Saxon-CE e o XSLT 2.0 comprovarão que são ferramentas úteis para o desenvolvimento desses aplicativos.


Conclusão

Os documentos CDA são persistentes e, como resultado, normalmente são bastante grandes. Apesar de serem legíveis por humanos, os documentos CDA também contêm muitas informações legíveis por máquinas, o que pode se tornar mais gerenciável pela transformação em uma exibição de cliente expandida. Tenho certeza de que com os releases futuros, o Saxon-CE provará ser uma ferramenta essencial para fazer exatamente isso, pois pode executar em qualquer navegador moderno, além de oferecer recursos de XSLT 2.0 no lado do cliente, como suporte para diversos documentos de resultado. Eu espero realmente que essa tecnologia se torne indispensável para os desenvolvedores de aplicativos avançados de assistência médica.



Download

DescriçãoNomeTamanhoMétodo de download
Sample CDA applicationcda_sample.zip16KBHTTP

Informações sobre métodos de download


Recursos

Aprender

Obter produtos e tecnologias

Discutir

Sobre o autor

Piers trabalha no segmento de mercado de software há 15 anos e é especialista em desenvolvimento Java, tecnologias XML e programação funcional. Contribuiu com vários projetos de software livre, e atualmente é consultor da Sierra Systems.

Ajuda para Relatar Abuso

Relatar abuso

Obrigado. Esta entrada foi sinalizada para atenção do moderador.


Ajuda para Relatar Abuso

Relatar abuso

Falha no envio do Relatório de abuso. Tente novamente mais tarde.


developerWorks: Registre-se


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Selecione seu nome de exibição

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

(Deve possuir de 3 a 31 caracteres.)


Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Classificar este artigo

Comentários

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Industries
ArticleID=763452
ArticleTitle=Implemente um aplicativo de assistência médica no lado do cliente usando o Saxon-CE e o HL7 CDA
publish-date=10062011

Conheça a IBM da sua cidade

Virtual Branch Office Brasil

A IBM está mais perto do que você imagina!


Tags

Help
Use o campo de pesquisa para encontrar todos os tipos de conteúdo no My developerWorks com essa tag.

Use a barra de rolagem para ver mais ou menos tags.

Tags populares mostra as principais tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Minhas tags mostra suas tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Use o campo de pesquisa para localizar todos os tipos de conteúdo no Meu developerWorks com essa tag. Tags populares mostra as tags principais para essa zona de conteúdo particular (por exemplo, tecnologia Java, Linux, WebSphere). My tags shows your tags for this particular content zone (for example, Java technology, Linux, WebSphere). Minhas tags mostra as suas tags para essa zona de conteúdo em particular (por exemplo, tecnologia Java, Linux, WebSphere).