我有以下xml文件:
<section>
<templateId root="2.16.840.1.113883.10.20.22.2.4" />
<text>
<list listType="ordered">
<item>9/18/2013 - Weight - 125 lbs</item>
<item>9/18/2013 - Blood Pressure - 120/80 mm Hg</item>
<item>9/18/2013 - BMI - 19 98</item>
<item>9/11/2013 - Weight - 125 lbs</item>
<item>9/11/2013 - Blood Pressure - 120/80 mm Hg</item>
<item>9/11/2013 - BMI - 19 98</item>
<item>9/11/2013 - Pulse - 32</item>
</list>
</text>
</section>
我有以下 xsl 模板信息:
<xsl:key name="vs_times" match="//hl7:section[hl7:templateId/@root='2.16.840.1.113883.10.20.22.2.4']/hl7:text/hl7:list/hl7:item" use="substring-before(., ' - ')"/>
<xsl:template match="hl7:section[hl7:templateId/@root='2.16.840.1.113883.10.20.22.2.4']">
<div style="padding: 5px; border-top: 1px solid #000000;">
<span style="font-weight: bold;">Vital Signs: </span>
<br/>
<table border="0" cellspacing="0" cellpadding="1" width="100%">
<xsl:apply-templates select="hl7:text/hl7:list/hl7:item[generate-id(.)=generate-id(key('vs_times', substring-before(., ' - ')))]" mode="group" />
</table>
</div>
</xsl:template>
<xsl:template match="hl7:item" mode="group">
<tr>
<td style="width: 76px;">
<xsl:value-of select="substring-before(., ' - ')" />
</td>
<xsl:variable name="values" select="key('vs_times', substring-before(., ' - '))"/>
<xsl:apply-templates select="$values" />
</tr>
</xsl:template>
<xsl:template match="hl7:item">
<td style="width: 180px; padding-left: 3px;">
<xsl:apply-templates select="." mode="content" />
</td>
</xsl:template>
<xsl:template match="hl7:item[contains(., 'Blood Pressure')]" mode="content">
<span style="font-weight: bold;">Blood Pressure: </span>
<xsl:value-of select="substring-before(substring-after(., 'Blood Pressure - '), ' ')"/>
</xsl:template>
<xsl:template match="hl7:item[contains(., 'Pulse')]" mode="content">
<span style="font-weight: bold;">Pulse: </span>
<xsl:value-of select="substring-before(substring-after(., 'Pulse - '), ' ')"/>
</xsl:template>
<xsl:template match="hl7:item[contains(., 'Weight')]" mode="content">
<span style="font-weight: bold;">Weight: </span>
<xsl:value-of select="substring-after(., 'Weight - ')"/>
</xsl:template>
<xsl:template match="hl7:item[contains(., 'BMI')]" mode="content">
<span style="font-weight: bold;">BMI: </span>
<xsl:value-of select="substring-before(substring-after(., 'BMI - '), ' ')"/>
</xsl:template>
<xsl:template match="hl7:item" mode="content">
 
</xsl:template>
这会输出信息,但我需要输出的顺序(可能)与正在迭代的项目不同。我需要它们始终保持相同的顺序:
- 血压
- 脉冲
- 重量
- 体重指数
截至目前,它只是循环浏览每个项目并在它们出现时输出它们。
此外,如果四个项目之一(因为示例中的第一组日期中没有脉冲项目),则需要有一个空格。最后,第二行需要是第一行以外的替代颜色。
谢谢
这有点棘手,但请尝试一下。事实证明,这似乎是使用choose/when
的好时机,但不是按照您计划的方式:
<xsl:key name="vs_times"
match="hl7:section
[hl7:templateId/@root='2.16.840.1.113883.10.20.22.2.4']
/hl7:text/hl7:list/hl7:item" use="substring-before(., ' - ')"/>
<xsl:template match="hl7:section
[hl7:templateId/@root='2.16.840.1.113883.10.20.22.2.4']">
<div style="padding: 5px; border-top: 1px solid #000000;">
<span style="font-weight: bold;">Vital Signs: </span>
<br/>
<table border="0" cellspacing="0" cellpadding="1" width="100%">
<xsl:apply-templates
select="hl7:text/hl7:list/hl7:item
[generate-id(.)=
generate-id(key('vs_times',
substring-before(., ' - ')))]"
mode="group" />
</table>
</div>
</xsl:template>
<xsl:template match="hl7:item" mode="group">
<tr>
<td style="width: 76px;">
<xsl:value-of select="substring-before(., ' - ')" />
</td>
<xsl:variable name="values"
select="key('vs_times', substring-before(., ' - '))"/>
<xsl:call-template name="row">
<xsl:with-param name="type" select="'Blood Pressure'" />
<xsl:with-param name="values" select="$values" />
</xsl:call-template>
<xsl:call-template name="row">
<xsl:with-param name="type" select="'Pulse'" />
<xsl:with-param name="values" select="$values" />
</xsl:call-template>
<xsl:call-template name="row">
<xsl:with-param name="type" select="'Weight'" />
<xsl:with-param name="values" select="$values" />
</xsl:call-template>
<xsl:call-template name="row">
<xsl:with-param name="type" select="'BMI'" />
<xsl:with-param name="values" select="$values" />
</xsl:call-template>
</tr>
</xsl:template>
<xsl:template name="row">
<xsl:param name="type" />
<xsl:param name="values" select="/.." />
<xsl:variable name="foundValue" select="$values[contains(., $type)]" />
<td style="width: 180px; padding-left: 3px;">
<xsl:if test="$type = 'Pulse' or $type = 'BMI'">
<xsl:attribute name="class">alternate</xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="$foundValue">
<span style="font-weight: bold;">
<xsl:value-of select="concat($type, ': ')" />
</span>
<xsl:value-of select="substring-after($foundValue, concat($type, ' - '))"/>
</xsl:when>
<xsl:otherwise>
<xsl:text> </xsl:text>
</xsl:otherwise>
</xsl:choose>
</td>
</xsl:template>