XSLT - извлечение данных из таблицы вне текущего контекста. - PullRequest
0 голосов
/ 22 января 2020

Я искал все, что мог придумать, но не смог. Я явно новичок в xslt, поэтому, пожалуйста, будьте добры.

Во-первых, я боюсь, что не совсем понимаю, как работает <template>. Я видел на примере других, где объявлено несколько <template>. Однако, когда я делаю это, единственное, что отображается на выходе html, это последнее. Может быть, кто-то может помочь мне понять, как это работает. Я пролистал десятки ссылок и еще не понял этого. Ссылки на конкретные c учебные материалы и курсы приветствуются.

Во-вторых, вот проблема, с которой я работаю. Я думаю проблема связана с тем фактом, что for-each уменьшает контекст для value-of, и что я пытаюсь втянуть в третий value-of, находится вне этого контекста?

Вот урезанная версия xml Я применяю эту таблицу стилей к:

<?xml version="1.0" encoding="UTF-8"?>
<ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >  
  <component typeCode="COMP">
    <structuredBody classCode="DOCBODY" moodCode="EVN">
      <component typeCode="COMP" contextConductionInd="true">
        <section>
          <templateId root="2.16.840.1.113883.10.20.22.2.5" />
          <code code="11450-43" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="PROBLEM LIST" />
          <title>Problems</title>
          <entry typeCode="DRIV" contextConductionInd="true">
            <act xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" classCode="ACT" moodCode="EVN">
               <entryRelationship typeCode="SUBJ" inversionInd="false">
                <observation classCode="OBS" moodCode="EVN">
                   <value xsi:type="CD" code="73211009" displayName="Chronic kidney disease, unspecified" codeSystem="2.16.840.1.113883.6.96" codeSystemName="ICD-9-CM">
                    <originalText>
                      <reference value="#PROBKIND_0" />  
                    </originalText>
                  </value>
                </observation>
              </entryRelationship>
            </act>
          </entry>
          <entry typeCode="DRIV" contextConductionInd="true">
            <act xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" classCode="ACT" moodCode="EVN">
              <entryRelationship typeCode="SUBJ" inversionInd="false">
                <observation classCode="OBS" moodCode="EVN">
                  <value xsi:type="CD" code="196001008" displayName="Chronic obstructive pulmonary disease with acute lower respiratory infection" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT">
                    <originalText>
                      <reference value="#PROBKIND_1" />
                    </originalText>
                  </value>
                 </observation>
              </entryRelationship>
            </act>
          </entry>
         </section>
      </component>
    </structuredBody>
  </component>
</ClinicalDocument>

Вот что у меня есть в XSL-файле:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cda="urn:hl7-org:v3" xmlns:lookup="lookup" >  
    <xsl:output method="html"/>

    <xsl:variable name="problemEntries" select="if (count(//cda:component/cda:section[cda:templateId/@root='2.16.840.1.113883.10.20.22.2.5.1']) > 0) then
                                                //cda:component/cda:section[cda:templateId/@root='2.16.840.1.113883.10.20.22.2.5.1'] else
                                                //cda:component/cda:section[cda:templateId/@root='2.16.840.1.113883.10.20.22.2.5']"/>


    <lookup:oids>
        <row oid='2.16.840.1.113883.6.1' oidName='LOINC'/>
        <row oid='2.16.840.1.113883.6.103' oidName='ICD9CM'/>
        <row oid='2.16.840.1.113883.6.104' oidName='ICD9CM'/>
        <row oid='2.16.840.1.113883.6.12' oidName='CPT'/>
        <row oid='2.16.840.1.113883.6.4' oidName='ICD10PCS'/>
        <row oid='2.16.840.1.113883.6.88' oidName='RXNORM'/>
        <row oid='2.16.840.1.113883.6.90' oidName='ICD10CM'/>
        <row oid='2.16.840.1.113883.6.96' oidName='SNOMEDCT'/>
    </lookup:oids>



    <xsl:template match="/">
        <html>
            <body>
                <b>TEST Canonical Codes:</b>
                <table border="1">
                    <tr>
                        <th>OID</th>
                        <th>System Name</th>
                        <th>Canonical System Name</th>
                    </tr>
                    <xsl:for-each select="distinct-entries($problemEntries/cda:entry/cda:act/cda:entryRelationship/cda:observation/cda:value)">
                    <tr>
                        <td>
                            <xsl:value-of select="@codeSystem" /> <!-- to return the unique codeSystem (oid) values in the xml being evaluated -->
                        </td>
                        <td>
                            <xsl:value-of select="@codeSystemName" /> <!-- to return the unique codeSystemName values the document has for that oid (oidName) -->
                        </td>
                        <td>
                            <xsl:value-of select="//document('')/lookup:oids/row[@oid = @codeSystem]/@oidName" /> <!-- to look up the unique code (oid) from above and lookup what the conanical name is (oidName) -->
                        </td>
                    </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>             
    </template>
</xsl:stylesheet>

Я положил комментарии рядом с каждым из value-of, чтобы указать, что я пытаюсь сделать. В основном вот что я хочу сделать:

  • Получить уникальный список всех комбинаций codeSystem / codeSystemName из всех записей
  • для каждого из уникальных значений codeSystem. поиск в таблице для получения правильного oidName и отображения в соответствующей строке.

Вот мой ожидаемый результат в таблице HTML: HTML таблица вывода

1 Ответ

0 голосов
/ 22 января 2020

Проверьте это:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cda="urn:hl7-org:v3" xmlns:lookup="lookup" >  
    <xsl:output method="html"/>

    <xsl:variable name="problemEntries" select="if (count(//cda:component/cda:section[cda:templateId/@root='2.16.840.1.113883.10.20.22.2.5.1']) > 0) then
                                                //cda:component/cda:section[cda:templateId/@root='2.16.840.1.113883.10.20.22.2.5.1'] else
                                                //cda:component/cda:section[cda:templateId/@root='2.16.840.1.113883.10.20.22.2.5']"/>


    <xsl:variable name="OIDs">
            <row oid="2.16.840.1.113883.6.1" oidName="LOINC"/>
            <row oid="2.16.840.1.113883.6.103" oidName="ICD9CM"/>
            <row oid="2.16.840.1.113883.6.104" oidName="ICD9CM"/>
            <row oid="2.16.840.1.113883.6.12" oidName="CPT"/>
            <row oid="2.16.840.1.113883.6.4" oidName="ICD10PCS"/>
            <row oid="2.16.840.1.113883.6.88" oidName="RXNORM"/>
            <row oid="2.16.840.1.113883.6.90" oidName="ICD10CM"/>
            <row oid="2.16.840.1.113883.6.96" oidName="SNOMEDCT"/>
    </xsl:variable>


    <xsl:template match="/">
        <html>
            <body>
                <b>TEST Canonical Codes:</b>
                <table border="1">
                    <tr>
                        <th>OID</th>
                        <th>System Name</th>
                        <th>Canonical System Name</th>
                    </tr>
                    <xsl:for-each select="$problemEntries/cda:entry/cda:act/cda:entryRelationship/cda:observation/cda:value">
                    <tr>
                        <td>
                            <xsl:value-of select="@codeSystem" /> <!-- to return the unique codeSystem (oid) values in the xml being evaluated -->
                        </td>
                        <td>
                            <xsl:value-of select="@codeSystemName" /> <!-- to return the unique codeSystemName values the document has for that oid (oidName) -->
                        </td>
                        <td>
                            <xsl:value-of select="$OIDs//row[@oid = current()/@codeSystem]/@oidName" /> <!-- to look up the unique code (oid) from above and lookup what the conanical name is (oidName) -->
                        </td>
                    </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>             
    </xsl:template>
</xsl:stylesheet>

См. Преобразование в https://xsltfiddle.liberty-development.net/jz1Q1xZ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...