Opis oraz sposób użycia transformat dostarczonych od CSIOZ do e-recept. Przykłady kodu w języku JAVA.

Co to są te transformaty?

Transformata XLS / XLST – jest to oparty o XML język przekształceń dokumentów XML, tłumaczący dokument XML na plik typu XML, HTML, TXT itd. Prostymi słowami zamienia treść X na Y pewnymi wzorcami opisanymi w pliku XLS lub XLST.

Dla przykładu zamienia dokument HL7 (XML) na gotowy wydruk e-recepty (HTML).

Rodzaje transformat do e-recepty od CSIOZ

Transformata wydruku e-recepty (tr_info_recepty)

Pozwala na stworzenie gotowego wydruku HTML na podstawie dokumenty HL7 XML. Wymaga podania 4 składników Dodatkowo wymaga podania dwóch pól kluczPakietu oraz kodPakietu, otwrzymamy je od CSIOZ po poprawnym wystawieniu e-recepty w P1.

/**
 * Uzywawa transformaty na podanym xml by zwrocic HTML wydruku e-recepty
 * @param pierwszaReceptaXml
 * @return
 */
public String TransformWithWydrukHTML(String pierwszaReceptaXml, String kluczPakietu, String kodPakietu) throws TransformerException {
    StringWriter stringWriter;
    //sciezka gdzie znajduje się plik transformaty do wydruku
    Source xsl = new StreamSource(FilesHelper.GetFileFromResources("transformaty/infoReceptyWydruk/pl_informacja_o_receptach_1.3.1.xsl"));
    Source src = new StreamSource(new StringReader(pierwszaReceptaXml));
    stringWriter = new StringWriter();

    //Aby dzialalo na wieksze pliki, wymaga zmiany
    System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
    TransformerFactory fact = TransformerFactory.newInstance();
    Transformer transformer = fact.newTransformer(xsl);

    //parametry
    transformer.setParameter("SVG", "enabled");
    transformer.setParameter("kluczPakietu", kluczPakietu);
    transformer.setParameter("kodPakietu", kodPakietu);
    //todo pare recept
    //transformer.setParameter("doc2", pierwszaReceptaXml);
    //transformer.setParameter("doc3FN", pierwszaReceptaXml);
    //transformer.setParameter("doc4FN", pierwszaReceptaXml);
    //transformer.setParameter("doc5FN", pierwszaReceptaXml);

    transformer.transform(src, new StreamResult(stringWriter));

    return stringWriter.toString();
}

Transformata bloku narracyjnego (tr_narrativeBlock)

Umożliwia spójność w dokumencie HL7 (e-recepta) pomiędzy polami <text> a resztą pól. Brak spójności od 1.04.2020 uniemożliwi wystawienie e-recepty. W poniższym przykładzie użyłem biblioteki JSoup do parsowania pliku XML, dokładnie chodzi o wyciągnięcie bloku Section.

    /**
     * Uzywa transformaty na podanym xml by wygenerowac bloki narracyjne sekcja1 dla Recepty
     * @param xml
     * @return pierwsze pole section
     */
    public String TransformWithNarracyjneBlokiSection1(String xml) throws TransformerException {
        Source xsl = new StreamSource(new StringReader(FILE_TRANSFORMATA_NARRACYJNE_BLOKI));
        Source src = new StreamSource(new StringReader(xml));
        StringWriter stringWriter = new StringWriter();

        TransformerFactory fact = TransformerFactory.newInstance();
        Transformer transformer = fact.newTransformer(xsl);

        transformer.transform(src, new StreamResult(stringWriter));

        //Wyciagamy pierwsze pole section za pomoca biblioteki JSoup
        Document doc = Jsoup.parse(stringWriter.toString(), "", Parser.xmlParser());
        doc.outputSettings().indentAmount(0).prettyPrint(false);
        String result = doc.select("section").get(0).html();

        return result;
    }