首页 > 解决方案 > XSLT 3.0 身份转换文档集合?

问题描述

我有一个 XSLT 3.0:

<xsl:stylesheet version="3.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    xmlns:n1="urn:hl7-org:v3">
    <xsl:output indent="yes" method="xml" encoding="utf-8"/>
    
    <xsl:param name="icd10Map" as="map(xs:string, xs:string)"
        select="
        map {
        '1742': 'C502',
        '55090': 'K409',
        '8442': 'S8350',
        '7172': 'M2332',
        '36616': 'H251',
        '4550': 'K648'        
        }"/>
    <xsl:variable name="map-keys" select="map:keys($icd10Map)"/>
    <xsl:mode on-no-match="shallow-copy"/>
    <xsl:template match="n1:translation[@codeSystemName = 'ICD-9-CM']/@code">
        <xsl:attribute name="code">
            <xsl:value-of select="$icd10Map($map-keys[translate(normalize-space(current()), ' &#x9;&#xa;&#xD;.;', '') = .])"/>
        </xsl:attribute>
    </xsl:template>
        
</xsl:stylesheet>

一个输入 XML:

<?xml-stylesheet type="text/xsl" href="./Content/xsl/CDA.xsl"?>
<ClinicalDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 NIST_C32_schema/C32_CDA.xsd" xmlns="urn:hl7-org:v3" xmlns:sdtc="urn:hl7-org:sdtc">
  <realmCode code="US" />
  <typeId root="2.16.840.1.113883.1.3" extension="POCD_HD000040" />
  <templateId root="2.16.840.1.113883.10.20.22.1.1" />
************************************************************
  <id extension="TT988" root="2.16.840.1.113883.19.5.99999.1" />
  <code codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" code="11504-8" displayName="Surgical Operation Note" />
  <title>Operative Report</title>
****************************************************
 <component>
    <structuredBody>
      <component>
        <section>
***********************
          <entry>
            <act moodCode="EVN" classCode="ACT">
              <templateId root="2.16.840.1.113883.10.20.22.4.65" />
              <code code="10219-4" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Preoperative Diagnosis" />
              <entryRelationship typeCode="SUBJ">
                <observation classCode="OBS" moodCode="EVN">
                  <code code="282291009" displayName="Diagnosis" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT" />
                  <statusCode code="completed" />
                  <!-- ICD-9 be transformed to ICD-10 -->
                  <value nullFlavor="OTH" type="CD">
                    <translation code="366.16" displayName="Nuclear sclerosis" codeSystem="2.16.840.1.113883.6.103" codeSystemName="ICD-9-CM" />
                  </value>
                </observation>
              </entryRelationship>
            </act>
          </entry>
        </section>
      </component>

    </structuredBody>
  </component>
</ClinicalDocument>

Oxygen 中只有一个文档的转换场景没有问题:

*******************  
                          <value nullFlavor="OTH" type="CD">
                              <translation code="H251"
                                           displayName="Nuclear sclerosis"
                                           codeSystem="2.16.840.1.113883.6.103"
                                           codeSystemName="ICD-9-CM"/>
                           </value>
******************

但是,XSLT 3.0 身份转换collection似乎是这样工作的:

    <xsl:variable name="inFile" as="node()*" select="collection('hl7.xml')"/>
    <xsl:template match="/">
        <xsl:text>&#xA;&#xA;  ICD9 Target Transformation in the collection is: &#xA; </xsl:text>
        <xsl:for-each select="$inFile//n1:translation[@codeSystemName = 'ICD-9-CM']/@code">
            <xsl:value-of select="$icd10Map($map-keys[translate(normalize-space(current()), ' &#x9;&#xa;&#xD;.;', '') = .])" separator=" , "/>
        </xsl:for-each>
    </xsl:template>

结果:

  ICD9 Target Transformation in the collection is: 
    H251    
    H251    
    K648    
    K648    
    K409    
    K409    
    S8350    
    M2332    
    M2332    
    S8350

如果我将 XSLT 更改为:

    <xsl:mode on-no-match="shallow-copy"/>
    <xsl:variable name="inFile" as="node()*" select="collection('hl7.xml')"/>
    <xsl:template match="n1:translation[@codeSystemName = 'ICD-9-CM']/@code">
        <xsl:text>&#xA;&#xA;  ICD9 Target Transformation in the collection is: &#xA; </xsl:text>
        <xsl:for-each select="$inFile">
            <xsl:attribute name="code">
            <xsl:value-of select="$icd10Map($map-keys[translate(normalize-space(current()), ' &#x9;&#xa;&#xD;.;', '') = .])" separator=" , "/>
            </xsl:attribute>
        </xsl:for-each>
    </xsl:template>

它似乎没有发生任何转换,只是URI目录文件中列表的提取hl7.xml

XSD我开发了一个 Java 应用程序,它可以针对、transform(不带)批量验证文档,collection()最后write将文档放入数据库中。日志记录是期望的结果:

Engine Instantiation: com.fc.andante.sax.SAXValidateStreamTransformWrite

Schema Validation Status: files in:/ml/Andante/data/data are validated against schema file:/ml/Andante/data/operation-transform.xsd

User 'auditor' has validated files in:/ml/Andante/data/data on 2020-08-26T23:05:26.357431

*****************

Transaction Status: Authenticating database writer... 

Transaction Status: User audited as 'super' is transforming document set...

Transaction Status: Document data/data/cataract.xml is successfully transformed and written into database with uri '/xslt-transform/cataract.xml'

Transaction Status: Document data/data/breast-surgery.xml is successfully transformed and written into database with uri '/xslt-transform/breast-surgery.xml'

Transaction Status: Document data/data/hernia.xml is successfully transformed and written into database with uri '/xslt-transform/hernia.xml'

Transaction Status: Document data/data/colonoscopy.xml is successfully transformed and written into database with uri '/xslt-transform/colonoscopy.xml'

Transaction Status: Document data/data/knee.xml is successfully transformed and written into database with uri '/xslt-transform/knee.xml'

Die Transaktion wurde erfolgreich abgeschlossen 2020-08-26T23:05:28.341385700

任何人都可以帮助解决 XSLT 3.0 Collections 转换问题吗?

标签: javaxsltxslt-3.0

解决方案


我会使用全局参数

<xsl:param name="inFiles" as="document-node()*" select="collection('hl7.xml')"/>

然后使用命名模板开始处理

<xsl:template name="xsl:initial-template">
  <xsl:for-each select="$inFiles">
    <xsl:result-document href="/xslt-transform/{tokenize(document-uri(), '/')[last()]}">
      <xsl:apply-templates/>
    </xsl:result-document>
  </xsl:for-each>
</xsl:template>

然后您可以xsl:import从问题中获得您的第一个 XSLT 示例,当然也可以对其进行编辑以插入我显示的代码。确保让 Saxon 从命名模板开始(-itSaxon 的命令行选项;在 oXygen 中不提供源文档)。


推荐阅读