0

我有以下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>
    </list>
  </text>
</section>

我需要让 html 输出如下所示:

<table>
  <tr>
    <td>9/18/2013</td>
    <td>Blood Pressure - 120/80</td>
    <td>Weight - 125lbs</td>
    <td>BMI - 19</td>
  </tr>
</table>

我在我的 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(., ' - ')"/>

这是为了获取日期。在我的 xml 中,可能有不止一组日期(但最多两个),第二个日期选项将是上表示例中的另一行。

这是我要输出的 xsl 模板信息:

<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;">
    <table border="0" cellspacing="0" cellpadding="1" width="100%">
      <xsl:for-each select="hl7:text/hl7:list/hl7:item[generate-id(.)=generate-id(key('vs_times', substring-before(., ' - ')))]">
        <tr>
          <td style="width: 76px;">
            <xsl:value-of select="substring-before(., ' - ')" />
          </td>
          <xsl:variable name="values" select="key('vs_times', substring-after(., ' - '))"/>
          <td style="width: 180px; padding-left: 3px;">
            <xsl:choose>
              <xsl:when test="substring-before($values, ' - ') = 'Blood Pressure'">
                <span style="font-weight: bold;">Blood Pressure: </span>
                <xsl:value-of select="substring-after($values, ' - ')"/>
              </xsl:when>
              <xsl:otherwise>
                &#xa0;
              </xsl:otherwise>
            </xsl:choose>
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </div>
</xsl:template>

(这只是一个片段。如果我可以让一个表格单元格显示血压,那么我可以为其他列表项复制它)。我遇到的问题是日期显示没有问题。但是,下一个表格单元格没有出现。我不知道我是否引用了我的密钥错误,或者我引用的值是否显示错误。

谢谢

4

1 回答 1

1

看起来你有substring-after你应该有的地方substring-before

<xsl:variable name="values" select="key('vs_times', substring-after(., ' - '))"/>

应该:

<xsl:variable name="values" select="key('vs_times', substring-before(., ' - '))"/>

这应该有substring-after

<xsl:when test="substring-before($values, ' - ') = 'Blood Pressure'">

此外,您需要遍历其中的项目$values(最好使用模板而不是for-each),但您似乎已经知道这一点。像这样的东西:

  <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;">
      <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-after(., 'Blood Pressure - ')"/>
  </xsl:template>

  <xsl:template match="hl7:item" mode="content">
    &#xa0;
  </xsl:template>
于 2013-10-04T15:39:35.283 回答