我是个新手,在分组XML数据方面有问题。我的数据如下(文件的第一部分是500个病例的病例(病人)数据,文件的末尾部分是这些病例的诊断和手术数据):
<?xml version="1.0" encoding="UTF-8"?>
<rootCases>
<caselist>
<row>
<CaseID>2736</CaseID>
<!-- 500 cases and their information -->
</row>
</caselist>
<!-- Diagnoses and operations start here -->
<rootDiagnoses>
<row>
<CaseID>2736</CaseID>
<DiagnoseID>15569</DiagnoseID>
<AIS>854471.2</AIS>
<Description>Fibula fracture, shaft on left</Description>
<Main_Diagnose>false</Main_Diagnose>
<OperationsID/>
<SurgeryDate/>
<Main_surgery/>
<Operation_text/>
</row>
<row>
<CaseID>2736</CaseID>
<DiagnoseID>15570</DiagnoseID>
<AIS>854251.2</AIS>
<Description>Tibia fracture shaft on left</Description>
<Main_Diagnose>false</Main_Diagnose>
<OperationsID>262</OperationsID>
<SurgeryDate>2012-03-13</SurgeryDate>
<Main_surgery>false</Main_surgery>
<Operation_text/>
</row>
<row>
<CaseID>2736</CaseID>
<DiagnoseID>15570</DiagnoseID>
<AIS>854251.2</AIS>
<Description>Tibia fracture shaft on left</Description>
<Main_Diagnose>false</Main_Diagnose>
<OperationsID>261</OperationsID>
<SurgeryDate>2012-03-13</SurgeryDate>
<Main_surgery>true</Main_surgery>
<Operation_text>Reductio et laminofixatio Reductio et laminofixatio</Operation_text>
</row>
</rootDiagnoses>
</rootCases>因此,病例可以有0.n的诊断,而诊断可以有0.n的手术(=外科手术)。其中一项操作应标出为主要操作。
我的代码如下:
<!-- Begin diagnoses list Element -->
<xsl:variable name="caseident" select="CaseID" />
<xsl:choose>
<xsl:when test="/rootCases/rootDiagnoses/row/CaseID[text()=$caseident]/../AIS !=''">
<diagnosisList>
<xsl:for-each select="/rootCases/rootDiagnoses/row[CaseID=$caseident]">
<!-- ERROR: Multiple diagnoses inserted when patient has
multiple operations per diagnose -->
<xsl:if test="AIS !=''"><diagnosis>
<ais2005Code><xsl:value-of select="AIS"/></ais2005Code>
<descriptionDiagnosis><xsl:value-of select="Description"/></descriptionDiagnosis>
<xsl:if test="SurgeryDate !='' and Main_surgery ='true'"><surgery1>
<date><xsl:value-of select="SurgeryDate"/></date>
<description><xsl:value-of select="Operation_text"/></description>
</surgery1></xsl:if>
</diagnosis></xsl:if>
</xsl:for-each>
</diagnosisList>
</xsl:when>
<xsl:otherwise><noDiagnosisList/></xsl:otherwise>
</xsl:choose>因此,我想要的是列出所有的诊断(每个唯一的诊断只列出一次):
<!-- Diagnoses List Element of patient 2736-->
<diagnosisList>
<diagnosis>
<ais2005Code>854471.2</ais2005Code>
<descriptionDiagnosis>Fibula fracture, shaft on left</descriptionDiagnosis>
</diagnosis>
<diagnosis>
<ais2005Code>854251.2</ais2005Code>
<descriptionDiagnosis>Tibia fracture shaft on left</descriptionDiagnosis>
<surgery1>
<date>2012-03-13</date>
<description>Reductio et laminofixatio Reductio et laminofixatio</description>
</surgery1>
</diagnosis>
</diagnosisList>DiagnoseID是原始数据库中的主要密钥字段,可用于对诊断进行分组。但我不知道该怎么做。我需要的是所有的诊断(用所谓的AIS代码编码),如果有手术(=手术)或与诊断相关的手术,我需要主要的手术信息(次要的,不太重要的手术没有显示)。目前发生的情况是,如果有多个与诊断相关的操作,我会得到多个相同的诊断。
我查看了Muenchian分组,但我认为这在这里没有必要,因为我已经有了一个识别每个诊断的唯一关键字段。或者是这样?我很抱歉这么长时间(含糊不清?)问题,但我对这件事很陌生,不知道该怎么做。感谢所有的帮助!
发布于 2014-03-25 12:09:43
我调查了门坚集团,但我认为这在这里没有必要
嗯,你确实需要一些东西才能得到明确的诊断--要么是门一边分组,要么是主题上的一些变化。下面是一个关于它如何工作的快速演示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="diag-by-case" match="rootDiagnoses/row" use="CaseID" />
<xsl:key name="diag-by-diag" match="rootDiagnoses/row" use="DiagnoseID" />
<xsl:template match="/">
<output>
<xsl:for-each select="rootCases/caselist/row">
<case id="{CaseID}">
<!-- for each unique diagnosis -->
<xsl:for-each select="key('diag-by-case', CaseID)[count(. | key('diag-by-diag', DiagnoseID)[1]) = 1]">
<diagnosis id="{DiagnoseID}">
</diagnosis>
</xsl:for-each>
</case>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>应用于您的输入,将获得以下结果:
<?xml version="1.0" encoding="UTF-8"?>
<output>
<case id="2736">
<diagnosis id="15569"/>
<diagnosis id="15570"/>
</case>
</output>或者,如果您的处理器支持EXSLT distinct()函数,则可以使用它。
编辑:
下面是一个扩展版本,它更接近您的预期结果:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="diag-by-case" match="rootDiagnoses/row" use="CaseID" />
<xsl:key name="diag-by-diag" match="rootDiagnoses/row" use="DiagnoseID" />
<xsl:template match="/">
<output>
<xsl:for-each select="rootCases/caselist/row">
<case id="{CaseID}">
<!-- for each unique diagnosis -->
<xsl:for-each select="key('diag-by-case', CaseID)[count(. | key('diag-by-diag', DiagnoseID)[1]) = 1]">
<diagnosis id="{DiagnoseID}">
<ais2005Code><xsl:value-of select="AIS"/></ais2005Code>
<descriptionDiagnosis><xsl:value-of select="Description"/></descriptionDiagnosis>
<!-- get surgery -->
<xsl:for-each select="key('diag-by-diag', DiagnoseID)[Main_surgery='true']">
<surgery1>
<date><xsl:value-of select="SurgeryDate"/></date>
<description><xsl:value-of select="Operation_text"/></description>
</surgery1>
</xsl:for-each>
</diagnosis>
</xsl:for-each>
</case>
</xsl:for-each>
</output>
</xsl:template>
结果
<?xml version="1.0" encoding="UTF-8"?>
<output>
<case id="2736">
<diagnosis id="15569">
<ais2005Code>854471.2</ais2005Code>
<descriptionDiagnosis>Fibula fracture, shaft on left</descriptionDiagnosis>
</diagnosis>
<diagnosis id="15570">
<ais2005Code>854251.2</ais2005Code>
<descriptionDiagnosis>Tibia fracture shaft on left</descriptionDiagnosis>
<surgery1>
<date>2012-03-13</date>
<description>Reductio et laminofixatio Reductio et laminofixatio</description>
</surgery1>
</diagnosis>
</case>
</output>发布于 2014-03-25 11:50:09
以下样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:variable name="diagnoses" select="rootCases/rootDiagnoses"/>
<xsl:for-each select="rootCases/caselist/row/CaseID">
<xsl:variable name="curr_ID" select="."/>
<diagnosisList id="{$curr_ID}">
<xsl:for-each select="$diagnoses/row[CaseID = $curr_ID]">
<xsl:variable name="curr_DiagnoseID" select="DiagnoseID"/>
<xsl:choose>
<!-- checks following rows and preceding rows
of the current row if it has duplicate DiagnoseID.
If found, checks whether if the current row has
a child Main_surgery = true. If none found,
the current node outputs nothing.
-->
<xsl:when test="$curr_DiagnoseID = following-sibling::row/DiagnoseID or $curr_DiagnoseID = preceding-sibling::row/DiagnoseID">
<xsl:if test="current()/Main_surgery = 'true'">
<diagnosis>
<ais2005Code><xsl:value-of select="descendant::AIS"/></ais2005Code>
<description><xsl:value-of select="descendant::Description"/></description>
<surgery1>
<date><xsl:value-of select="descendant::SurgeryDate"/></date>
<description><xsl:value-of select="descendant::Operation_text"/></description>
</surgery1>
</diagnosis>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<diagnosis>
<ais2005Code><xsl:value-of select="descendant::AIS"/></ais2005Code>
<description><xsl:value-of select="descendant::Description"/></description>
<xsl:if test="descendant::Main_surgery = 'true'">
<surgery1>
<date><xsl:value-of select="descendant::SurgeryDate"/></date>
<description><xsl:value-of select="descendant::Operation_text"/></description>
</surgery1>
</xsl:if>
</diagnosis>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</diagnosisList>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>当应用于上面的输入XML时,结果是:
<?xml version="1.0" encoding="utf-8"?>
<diagnosisList id="2736">
<diagnosis>
<ais2005Code>854471.2</ais2005Code>
<description>Fibula fracture, shaft on left</description>
</diagnosis>
<diagnosis>
<ais2005Code>854251.2</ais2005Code>
<description>Tibia fracture shaft on left</description>
<surgery1>
<date>2012-03-13</date>
<description>Reductio et laminofixatio Reductio et laminofixatio</description>
</surgery1>
</diagnosis>
</diagnosisList>https://stackoverflow.com/questions/22633145
复制相似问题