0

我有一个包含以下数据的 xml 文件:

<structuredBody>
  <component>
    <section>
      <templateId root="2.16.840.1.113883.10.20.22.2.3.1" />
      <entry>
        <organizer>
          <component>
            <observation>
              <code displayName="TIBC" />
              <effectiveTime value="8/29/2013 12:00:00 AM" />
              <value value="39" />
              <referenceRange>
                <observationRange>
                  <text />
                </observationRange>
              </referenceRange>
            </observation>
          </component>
        </organizer>
      </entry>
      <entry>
        <organizer>
          <component>
            <observation>
              <code displayName="TSAT" />
              <effectiveTime value="8/29/2013 12:00:00 AM" />
              <value value="25" />
              <referenceRange>
                <observationRange>
                  <text />
                </observationRange>
              </referenceRange>
            </observation>
          </component>
        </organizer>
      </entry>
      <entry>
        <organizer>
          <component>
            <observation>
              <code displayName="Albumin" />
              <effectiveTime value="9/5/2013 12:00:00 AM" />
              <value value="46" />
              <referenceRange>
                <observationRange>
                  <text />
                </observationRange>
              </referenceRange>
            </observation>
          </component>
        </organizer>
      </entry>
      <entry>
        <organizer>
          <component>
            <observation>
              <code displayName="ALT" />
              <effectiveTime value="9/5/2013 12:00:00 AM" />
              <value value="48" />
              <referenceRange>
                <observationRange>
                  <text>21-72</text>
                </observationRange>
              </referenceRange>
            </observation>
          </component>
        </organizer>
      </entry>
      <entry>
        <organizer>
          <component>
            <observation>
              <code displayName="Bicarbonate" />
              <effectiveTime value="9/5/2013 12:00:00 AM" />
              <value value="69" />
              <referenceRange>
                <observationRange>
                  <text />
                </observationRange>
              </referenceRange>
            </observation>
          </component>
        </organizer>
      </entry>
    </section>
  </component>
  <component>
    <section>
      <...>
    </section>
  </component>
  <component>
    <section>
      <...>
    </section>
  </component>
</structuredBody>

我想输出充实部分片段中的数据,使其位于包含四列的两列表中。我的意思是我希望每个条目提取四个值,然后将完整的条目输出(输出时需要包含有效时间/@值、代码/@显示名称、值/@值和参考范围/观察范围/文本)级联到页面首先向下然后结束。使用示例数据,它看起来像:

<table>
  <tr>
    <td>entry set 1</td>
    <td>entry set 4</td>
  </tr>
  <tr>
    <td>entry set 2</td>
    <td>entry set 5</td>
  </tr>
  <tr>
    <td>entry set 3</td>
    <td>&nbsp;</td>
  </tr>
</table>

我可以通过在该位置上做一个模型来让它穿过然后向下,但我不知道如何让它先向下然后穿过。

这是我拥有的 xsl,但我没有得到任何输出:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ms="urn:schemas-microsoft-com:xslt"
  xmlns="http://www.w3.org/1999/xhtml">

  <xsl:output method="html" indent="yes"/>
  <xsl:param name="colLabs" select="2"/>

  <xsl:template match="/">
    <xsl:if test="//section[templateId/@root='2.16.840.1.113883.10.20.22.2.3.1']!=''">
      <xsl:variable name="rowLabs" select="ceiling(count(entry) div $colLabs)" />

      <div style="margin-bottom: 5px; padding: 5px; border-bottom: 1px solid #000000;">
        <span style="font-weight: bold;">Lab Results:</span>
        <table border="0" cellspacing="0" cellpadding="1" width="99%" style="font-size: 11px;">
          <xsl:for-each select="//section[templateId/@root='2.16.840.1.113883.10.20.22.2.3.1']/entry[position() &lt;= $rowLabs]">
            <tr>
            <xsl:variable name="otherEntries" select=".|following-sibling::entry[position() mod $rowLabs = 0]" />
            <xsl:apply-templates select="self::*|$otherEntries" />
            <xsl:call-template name="blankentries">
              <xsl:with-param name="entries" select="$colLabs - count($otherEntries) - 1" />
            </xsl:call-template>
            </tr>
          </xsl:for-each>
        </table>
      </div>
    </xsl:if>

  </xsl:template>

  <xsl:template match="entry">
    <td>
      <xsl:number />
    </td>
  </xsl:template>

  <xsl:template name="blankentries">
    <xsl:param name="entries" />
    <xsl:if test="$entries > 0">
      <td></td>
      <xsl:call-template name="blankentries">
        <xsl:with-param name="entries" select="$entries - 1" />
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

感谢您在这方面的任何帮助。我唯一需要做的另一件事是在有效时间/@值与之前的条目相同时抑制它(因此只显示每个日期一次)。

再次感谢。

4

1 回答 1

3

简化问题,我将从计算表所需的行数开始(我假设您希望此处的每个部分元素都有一个表)

<xsl:variable name="rows" select="ceiling(count(entry) div $columns)" />

(注意$columns是一个变量,在这种情况下将包含“2”,但可以更改为您想要的任意数量的列)

这将允许您为每行的开头选择正确数量的条目元素

<xsl:for-each select="entry[position() &lt;= $rows]">

然后是输出第一个元素的表格单元格,然后是行中的其他条目元素的情况。要获取其他元素,您可以这样做:

<xsl:variable name="otherEntries" select="following-sibling::entry[position() mod $rows = 0]" />

这里唯一的小问题是,如果没有足够的其他条目元素来填充该行,您希望输出空单元格。在 XSLT 1.0 中,您必须为此使用递归调用的命名模板。

尝试以下 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" method="xml" />

  <xsl:param name="columns" select="2" />

  <xsl:template match="section">
    <xsl:variable name="rows" select="ceiling(count(entry) div $columns)" />

    <table>
      <xsl:for-each select="entry[position() &lt;= $rows]">
        <tr>
          <xsl:variable name="otherEntries" select="following-sibling::entry[position() mod $rows = 0]" />
          <xsl:apply-templates select="self::*|$otherEntries" />
          <xsl:call-template name="blankentries">
            <xsl:with-param name="entries" select="$columns - count($otherEntries) - 1" />
          </xsl:call-template>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>

  <xsl:template match="entry">
    <td>
      <xsl:number />
    </td>
  </xsl:template>

  <xsl:template name="blankentries">
    <xsl:param name="entries" />
    <xsl:if test="$entries > 0">
      <td></td>
      <xsl:call-template name="blankentries">
        <xsl:with-param name="entries" select="$entries - 1" />
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

当应用于您的 XML 时,将输出以下内容

<table>
  <tr>
    <td>1</td>
    <td>4</td>
  </tr>
  <tr>
    <td>2</td>
    <td>5</td>
  </tr>
  <tr>
    <td>3</td>
    <td />
  </tr>
</table>

显然你会用你需要的信息来填充它。

于 2013-09-10T12:44:53.267 回答