0

XML にまったく不慣れで申し訳ありませんが、この問題を解決することで、XSLT での計算がどのように機能するかを理解することができます。

次のような構造のサンプル データベースがあります。

<HospitalML>
<Patients>
    <Patient>
        <Name>
            <FirstName>Salvatore</FirstName>
            <LastName>Piscuoglio</LastName>
        </Name>
        <Diagnoses>
            <Diagnosis>
                <Name>HCC</Name>
                <Weight>1.2</Weight>
            </Diagnosis>
            <Diagnosis>
                <Name>CRC</Name>
                <Weight>2.2</Weight>
            </Diagnosis>
        </Diagnoses>
    </Patient>
</Patients>
<Hospitals>
    <Hospital>
        <HospitalName>LondonGeneral</HospitalName>
        <Diagnoses>
            <Diagnosis>
                <Name>HCC</Name>
                <Weight>2.1</Weight>
            </Diagnosis>
            <Diagnosis>
                <Name>CRC</Name>
                <Weight>0.2</Weight>
            </Diagnosis>
        </Diagnoses>
    </Hospital>
    <Hospital>
        <HospitalName>EastEnd</HospitalName>
        <Diagnoses>
            <Diagnosis>
                <Name>HCC</Name>
                <Weight>1.7</Weight>
            </Diagnosis>
            <Diagnosis>
                <Name>CRC</Name>
                <Weight>0.7</Weight>
            </Diagnosis>
        </Diagnoses>
    </Hospital>
</Hospitals>

各患者には、重症度を示す「重み」値を持つ一連の診断があります。各病院要素には、管理している疾患を示す「診断」子要素と、各病院がどれだけ優れているかを示す「重み」要素スコアがあります。

データベースから患者 Salvatore の病院を評価し、彼の診断に最適な病院を示すスコアによってランク付けされた病院のリストを提供したいと思います。

どんな考えにも感謝します。ありがとう。

4

1 に答える 1

0

この xslt :

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <!-- You could select one specific patient instead of all if you prefer.-->
        <xsl:apply-templates select=".//Patient"/>
    </xsl:template>

    <!-- This template just copy a patient and his name and 'do the job' for all the diagnoses. -->
    <xsl:template match="Patient">
        <xsl:copy>
            <xsl:copy-of select="Name"/>
            <xsl:apply-templates select="Diagnoses/Diagnosis"/>
        </xsl:copy>
    </xsl:template>

    <!-- Here is the template for the patient diagnosis (the predicate is just there to prevent mistakes with diagnosis element child of hospital) -->
    <xsl:template match="Diagnosis[ancestor::Patient]">
        <!-- we store the name and weight inside variables to simplify the xpaths below.
            Actually you may use the current() function, but was'nt sure about its support in XSLT 1.0-->
        <xsl:variable name="name" select="Name"/>
        <xsl:variable name="patientWeight" select="Weight"/>
        <!-- first statement, copy the diagnosis and its name. -->
        <xsl:copy>        
            <xsl:copy-of select="Name"/>
            <!-- then, search for hospitals which got same diagnosis -->
            <xsl:apply-templates select="//Hospital[.//Diagnosis/Name = $name]">
                <!-- sort them by their weight in the current diagnosis. This is the "real job", where you got your hospital 'rank' for a diagnosis.  -->
                <xsl:sort select=".//Diagnosis[Name = $name]/Weight" order="descending"/>
                <!-- use this param to be able to output only the weight of the current diagnosis -->
                <xsl:with-param name="diagnosis" select="$name"/>
                <xsl:with-param name="patientWeight" select="$patientWeight"/> 
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <!-- A simple template, that just output the hospital, its name and its weight score (aka : hospital weight * patient weight.  -->
    <xsl:template match="Hospital">
        <xsl:param name="diagnosis"/>
        <xsl:param name="patientWeight"/>
        <xsl:element name="Weight">                   
        <xsl:value-of select="number(.//Diagnosis[Name=$diagnosis]/Weight) * $patientWeight"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

この xml 出力を提供します。

<?xml version="1.0" encoding="utf-8"?>
<Patient>
   <Name>

      <FirstName>Salvatore</FirstName>

      <LastName>Piscuoglio</LastName>

   </Name>
   <Diagnosis>
      <Name>HCC</Name>
      <Hospital>
         <HospitalName>LondonGeneral</HospitalName>
         <Weight>2.52</Weight>
      </Hospital>
      <Hospital>
         <HospitalName>EastEnd</HospitalName>
         <Weight>2.04</Weight>
      </Hospital>
   </Diagnosis>
   <Diagnosis>
      <Name>CRC</Name>
      <Hospital>
         <HospitalName>EastEnd</HospitalName>
         <Weight>1.54</Weight>
      </Hospital>
      <Hospital>
         <HospitalName>LondonGeneral</HospitalName>
         <Weight>0.44</Weight>
      </Hospital>
   </Diagnosis>
</Patient>

xsl:copy および xsl:copy-of 呼び出しを個人の出力形式に切り替えるだけで、出力形式を変更できます。

これが役立つことを願っています。

于 2013-03-25T23:20:20.873 に答える