xslt 1.0-在一个表格单元格中只显示一个不同的值,作为多列表格的一部分,并显示其他颜色
我有一个xml文件,其中包含一些数据,这些数据在表中被分成两列(有效地)输出。这是XMLxslt 1.0-在一个表格单元格中只显示一个不同的值,作为多列表格的一部分,并显示其他颜色,xslt,xslt-1.0,Xslt,Xslt 1.0,我有一个xml文件,其中包含一些数据,这些数据在表中被分成两列(有效地)输出。这是XML <structuredBody> <component> <section> <templateId root="2.16.840.1.113883.10.20.22.2.3.1" /> <entry> <organizer> <component>
<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>
这就是我要找的,太好了
我搞不懂的是如何让不同的4单元输入集在经过时变成交替的颜色。我不能使用position(),因为我正在处理它以获得表中所需的输出顺序。如果我输出位置来计算数学,在左栏,它总是“1”,在右栏,它总是“2”,所以我不能用position()mod 2=1来设置样式属性
其次,我只希望日期值出现一次,然后直到它发生变化才出现。这将使输出理想情况下如下所示:
<table>
<tr>
<td>8/29/2013</td>
<td>TIBC</td>
<td>39</td>
<td></td>
<td bgcolor="dcdcdc"></td>
<td bgcolor="dcdcdc">ALT</td>
<td bgcolor="dcdcdc">48</td>
<td bgcolor="dcdcdc">21-72</td>
</tr>
<tr>
<td bgcolor="dcdcdc"></td>
<td bgcolor="dcdcdc">TSAT</td>
<td bgcolor="dcdcdc">25</td>
<td bgcolor="dcdcdc"></td>
<td></td>
<td>Bicarbonate</td>
<td>69</td>
<td></td>
</tr>
<tr>
<td>9/5/2013</td>
<td>Albumin</td>
<td>46</td>
<td></td>
</tr>
</table>
8/29/2013
TIBC
39
中高音
48
21-72
沙特
25
碳酸氢盐
69
9/5/2013
白蛋白
46
我不能将bgcolor属性放在“tr”标记中,因为它甚至应该在“columns”中交替,而不仅仅是整行
谢谢你的帮助。这个网站为我带来了很多xslt知识。我在上个月才开始研究它。对于颜色,根据
$rowLabs
是奇数还是偶数,基本上有两种情况
- 如果是偶数,则奇数行将完全为“白色”,偶数行将完全为“黑色”
- 如果是奇怪的话
- 对于奇数行,奇数列为白色,偶数列为黑色
- 对于偶数行,奇数列为黑色,偶数列为白色
position()
那样,因此第一行/列是奇数,第二行/列是偶数,以此类推)
通过向模板添加一些参数,可以在XSLT中对该逻辑进行编码。替换
<xsl:apply-templates select="self::*|$otherEntries" />
现在我们需要一个命名的模板,我们可以调用它来实现我上面描述的逻辑:
<xsl:template name="bgcolor">
<xsl:param name="rowNum" select="1" />
<xsl:param name="totalRows" select="2" />
<xsl:if test="($totalRows mod 2 = 0 and $rowNum mod 2 = 0) or
($totalRows mod 2 = 1 and $rowNum mod 2 != position() mod 2)">
<xsl:attribute name="bgcolor">dcdcdc</xsl:attribute>
</xsl:if>
</xsl:template>
使所有这些工作正常进行的关键是,您正在将模板应用于self::*|$otherEntries
,因此在应用的模板中调用position()
,将给出列号(此节点列表中的位置),而不是节点在其父节点中的原始位置
要使日期仅在第一次遇到时显示一次,可以定义一个键并使用与“Muenchian分组”技术相关的技巧。申报
<xsl:key name="effectiveTimeByDate" match="effectiveTime"
use="substring-before(@value, ' ')" />
然后,您可以使用
<td width="75">
<xsl:call-template name="bgcolor">
<xsl:with-param name="rowNum" select="$rowNum" />
<xsl:with-param name="totalRows" select="$totalRows" />
</xsl:call-template>
<xsl:if test="
generate-id(organizer/component/observation/effectiveTime)
= generate-id(key('effectiveTimeByDate', substring-before(
organizer/component/observation/effectiveTime/@value, ' '))[1])">
<xsl:call-template name="StripTime">
<xsl:with-param name="DateTime" select="organizer/component/observation/effectiveTime/@value" />
</xsl:call-template>
</xsl:if>
</td>
(您可以完全废弃
StripTime
模板,只需在调用之前使用子字符串,就像我在键中使用的一样)对于颜色,您基本上有两种情况,这取决于$rowLabs
是奇数还是偶数
- 如果是偶数,则奇数行将完全为“白色”,偶数行将完全为“黑色”
- 如果是奇怪的话
- 对于奇数行,奇数列为白色,偶数列为黑色
- 对于偶数行,奇数列为黑色,偶数列为白色
(“奇数”和“偶数”从1开始计数,就像XPathposition()
那样,因此第一行/列是奇数,第二行/列是偶数,以此类推)
通过向模板添加一些参数,可以在XSLT中对该逻辑进行编码。替换
<xsl:apply-templates select="self::*|$otherEntries" />
现在我们需要一个命名的模板,我们可以调用它来实现我上面描述的逻辑:
<xsl:template name="bgcolor">
<xsl:param name="rowNum" select="1" />
<xsl:param name="totalRows" select="2" />
<xsl:if test="($totalRows mod 2 = 0 and $rowNum mod 2 = 0) or
($totalRows mod 2 = 1 and $rowNum mod 2 != position() mod 2)">
<xsl:attribute name="bgcolor">dcdcdc</xsl:attribute>
</xsl:if>
</xsl:template>
使所有这些工作正常进行的关键是,您正在将模板应用于self::*|$otherEntries
,因此在应用的模板中调用position()
,将给出列号(此节点列表中的位置),而不是节点在其父节点中的原始位置
要使日期仅在第一次遇到时显示一次,可以定义一个键并使用与“Muenchian分组”技术相关的技巧。申报
<xsl:key name="effectiveTimeByDate" match="effectiveTime"
use="substring-before(@value, ' ')" />
然后,您可以使用
<td width="75">
<xsl:call-template name="bgcolor">
<xsl:with-param name="rowNum" select="$rowNum" />
<xsl:with-param name="totalRows" select="$totalRows" />
</xsl:call-template>
<xsl:if test="
generate-id(organizer/component/observation/effectiveTime)
= generate-id(key('effectiveTimeByDate', substring-before(
organizer/component/observation/effectiveTime/@value, ' '))[1])">
<xsl:call-template name="StripTime">
<xsl:with-param name="DateTime" select="organizer/component/observation/effectiveTime/@value" />
</xsl:call-template>
</xsl:if>
</td>
(您可以完全废弃StripTime
模板,只需在调用之前使用子字符串,就像我在键中使用的一样)那么如何将其传递到构建表单元格的xsl:template中呢?我知道我不能使用一个基于条件操纵其值的变量(就像在.NET应用程序中一样)。@jjasper0729对不起,我当时正在编辑中,现在它更有意义了吗?我想我开始理解了。我会掌握这个窍门的。从.NET编程到XSLT如何处理事情,这是思维方式的一个重大变化。这对交替颜色非常有效。现在,我需要做的就是找出如何让重复的日期不出现(根据问题中所需的表输出),这对我来说非常有效。我知道我不太精通XSLT编码,所以现在我需要深入研究“为什么”,而不仅仅是“如何”,这样我才能让这成为第二天性。与.NET的子程序和函数调用相比,这是一个很大的变化。感谢您的帮助。那么我如何将其传递到构建表单元格的xsl:template中呢?我知道我不能使用一个基于条件操纵其值的变量(就像在.NET应用程序中一样)。@jjasper0729对不起,我当时正在编辑中,现在它更有意义了吗?我想我开始理解了。我会掌握这个窍门的。从.NET编程到XSLT如何处理事情,这是思维方式的一个重大变化。这对交替颜色非常有效。现在,我需要做的就是找出如何让重复的日期不出现(根据问题中所需的表输出),这对我来说非常有效。我知道我不是很精通我
<xsl:key name="effectiveTimeByDate" match="effectiveTime"
use="substring-before(@value, ' ')" />
<td width="75">
<xsl:call-template name="bgcolor">
<xsl:with-param name="rowNum" select="$rowNum" />
<xsl:with-param name="totalRows" select="$totalRows" />
</xsl:call-template>
<xsl:if test="
generate-id(organizer/component/observation/effectiveTime)
= generate-id(key('effectiveTimeByDate', substring-before(
organizer/component/observation/effectiveTime/@value, ' '))[1])">
<xsl:call-template name="StripTime">
<xsl:with-param name="DateTime" select="organizer/component/observation/effectiveTime/@value" />
</xsl:call-template>
</xsl:if>
</td>