xslt 1.0-在一个表格单元格中只显示一个不同的值,作为多列表格的一部分,并显示其他颜色

xslt 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>

我有一个xml文件,其中包含一些数据,这些数据在表中被分成两列(有效地)输出。这是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>
这就是我要找的,太好了

我搞不懂的是如何让不同的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
是奇数还是偶数,基本上有两种情况

  • 如果是偶数,则奇数行将完全为“白色”,偶数行将完全为“黑色”
  • 如果是奇怪的话
    • 对于奇数行,奇数列为白色,偶数列为黑色
    • 对于偶数行,奇数列为黑色,偶数列为白色
(“奇数”和“偶数”从1开始计数,就像XPath
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开始计数,就像XPath
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
模板,只需在调用
之前使用
子字符串,就像我在键中使用的一样)

那么如何将其传递到构建表单元格的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>