我有一个包含以下数据的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>
我想输出在fleshed out部分片段中的数据,使其位于包含四列的双列表中。我的意思是我希望每个条目提取四个值,然后完整的条目输出(需要包含effectiveTime / @值,代码/ @ displayName,值/ @值和输出时的referenceRange / observationRange / text)才能级联到页面先下来然后结束。使用示例数据,它看起来像:
<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> </td>
</tr>
</table>
我可以通过在位置上做一个mod来让它过去然后下来但是我无法弄清楚如何先做下去然后再过去。
这是我拥有的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() <= $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>
感谢您的帮助。我需要做的唯一的另一件事是当它与之前的条目相同时,压缩有效时间/ @值(因此只显示每个日期一次)。
再次感谢。
答案 0 :(得分:3)
简化问题,我首先计算表格所需的行数(我假设你想要一个表格,每个部分元素)
<xsl:variable name="rows" select="ceiling(count(entry) div $columns)" />
(注意 $ columns 是一个变量,在此实例中将保留&#39; 2&#39;但可以更改为您想要的任意数量的列)
这样您就可以为每行的开头选择正确数量的条目元素
<xsl:for-each select="entry[position() <= $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() <= $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>
显然,你会用你需要的信息来填补这一点。