XSL模板输出的特定顺序

时间:2013-10-04 17:01:36

标签: xml xslt xslt-1.0 xslt-grouping

我有以下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">
    &#xa0;
</xsl:template>

这会输出信息,但我需要输出的顺序(可能)与正在迭代的项目不同。我需要它们始终保持相同的顺序:

  • 血压
  • 脉冲
  • 重量
  • BMI

截至目前,它只是循环遍历每个项目并输出它们。

此外,如果四个项目中没有一个(因为示例中的第一组日期中没有脉冲项目),则需要有空格。最后,第二行需要是第一行的替代颜色。

由于

1 个答案:

答案 0 :(得分:1)

这有点棘手,但请试一试。事实证明,这似乎是使用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>&#xa0;</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </td>
  </xsl:template>