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;
}