English 中文(简体)
• 如何正确指明表格的编号?
原标题:How to correctly specify colname for tables?

我的资料来源是:

<TABLE>
  <ROW>
    <CELL ROWSPAN="3"> Test </CELL>
    <CELL ROWSPAN="2"> Test </CELL>
    <CELL ROWSPAN="1"> Test </CELL>
    <CELL ROWSPAN="3"> Test </CELL>
    <CELL ROWSPAN="1"> Test </CELL>
  </ROW>
  <ROW>
    <CELL ROWSPAN="1"> Test </CELL>
    <CELL ROWSPAN="1"> Test </CELL>
  </ROW>
</TABLE>

正确的转变产出应着眼于:

<tbody>
  <row>
    <entry colname="1"> Test </entry>
    <entry colname="2"> Test </entry>
    <entry colname="3"> Test </entry>
    <entry colname="4"> Test </entry>
    <entry colname="5"> Test </entry>
 </row>
 <row>
   <entry colname="3"> Test </entry>
   <entry colname="5"> Test </entry>
 </row>
</tbody>

你们可以看到,trick缩部分是第二行。 由于第一行有多个囚室,因此会影响到第二行的名号,这就是为什么第二行的第一行用的是“3”而不是“1”。 我不知道如何在这里提一个表格,但如果你在一份文件中描述,你将很容易理解。

目前,我有以下可部分捕获的xsl(我没有其他信息,因为我只存在@colname的问题)

<xsl:template match="CELL">
   <xsl:if test="../preceding-sibling::ROW[1]/CELL[1]/@ROWSPAN > 1">
     <xsl:attribute name="colname" select="position()+count(../preceding-sibling::ROW[1]/CELL[@ROWSPAN>1])"/>
    ..
   </xsl:if>
</xsl:template>

这样做不会奏效,因为它将把所有有 mu力行,的蓄水器都包括在内,因此其结果将如下:

  <row>
    <entry colname="4"> Test </entry>
    <entry colname="5"> Test </entry>
  </row> 

第一个条目应当真正从3开始。

我发现很难描述这一问题,但我将尽力,如果需要进一步信息的话,请发表以下评论。

最佳回答

This solution s quite complicated, and I ve got a nagging feeling there might be a better way of doing it, but it seems to work:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="TABLE">
    <tbody>
      <xsl:apply-templates select="ROW[1]" />
    </tbody>
  </xsl:template>

  <xsl:template match="ROW">
    <xsl:param name="occupiedcols" />
    <row>
      <xsl:apply-templates select="CELL[1]">
        <xsl:with-param name="occupiedcols" select="$occupiedcols" />
      </xsl:apply-templates>
    </row>
    <xsl:apply-templates select="following-sibling::ROW[1]">
      <xsl:with-param name="occupiedcols">
        <xsl:apply-templates select="CELL[1]" mode="getoccupied">
          <xsl:with-param name="occupiedcols" select="$occupiedcols" />
        </xsl:apply-templates>
        <xsl:text></xsl:text>
      </xsl:with-param>
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="CELL">
    <xsl:param name="occupiedcols" />
    <xsl:param name="col" select="1" />
    <xsl:variable name="thiscol" select="$col + string-length(substring-before(substring($occupiedcols,$col,255), 0 ))" />
    <xsl:element name="entry">
      <xsl:attribute name="colname">
        <xsl:value-of select="$thiscol" />
      </xsl:attribute>
    </xsl:element>
    <xsl:apply-templates select="following-sibling::CELL[1]">
      <xsl:with-param name="occupiedcols" select="$occupiedcols"/>
      <xsl:with-param name="col" select="$thiscol + 1" />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="CELL" mode="getoccupied">
    <xsl:param name="occupiedcols" />
    <xsl:param name="col" select="1" />
    <xsl:variable name="thiscol" select="$col + string-length(substring-before(substring($occupiedcols,$col,255), 0 ))" />
    <xsl:choose>
      <xsl:when test="contains(substring($occupiedcols,$col,255), 0 )">
        <xsl:value-of select="translate(substring-before(substring($occupiedcols,$col,255), 0 ), 0123456789 , -012345678 )" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="translate(substring($occupiedcols,$col,255), 123456789 , 012345678 )" />
      </xsl:otherwise>
    </xsl:choose>
    <xsl:value-of select="@ROWSPAN - 1" />
    <xsl:if test="not(following-sibling::CELL)">
      <xsl:value-of select="translate(substring($occupiedcols,$thiscol + 1, 255), 0123456789 , 0012345678 )" />
    </xsl:if>
    <xsl:apply-templates select="following-sibling::CELL[1]" mode="getoccupied">
      <xsl:with-param name="occupiedcols" select="$occupiedcols"/>
      <xsl:with-param name="col" select="$thiscol + 1" />
    </xsl:apply-templates>
  </xsl:template>
</xsl:stylesheet>

有一个已知的问题:如果一个囚室横跨9个以上的牢房,它将打破。 如果这是一个问题,它实际上很容易适应。

Also, it doesn t support any use of COLSPAN.

它通过一系列数字,详细说明每个栏中仍然有囚室的行数,因此,第二行将以你为例通过21020,并根据0分点计算<条码><>。 两行的第二次通行证将数位数减少一,但每间单位的位数为0位。

这一解决办法还假设,所有单元都有一个“条形”栏目,即使它们只覆盖一个字。 如果情况不如此,我可以补充一种手段,支持“条形表”的缺省。

问题回答

我认为,一个很好的想法是保持一种轨道矢量,即每栏中每个栏目中上列囚室的排数将扩大至该栏。 为此,你们必须使用再保险,因为你们必须改变每一行的轨道矢量,而XSLT则因为功能性方案拟订语言无法改变“变数”。

下面的风格表显示了有3栏的表格的想法。

<xsl:template match="TABLE2">
  <tbody>
    <xsl:call-template name="processRows">
      <xsl:with-param name="rows" select="ROW"/>
    </xsl:call-template>
  </tbody>
</xsl:template>

<xsl:template name="processRows">
  <xsl:param name="rows"/>
  <xsl:param name="index" select="1"/>
  <!-- Bit vector for the columns -->
  <xsl:param name="col1" select="0"/>
  <xsl:param name="col2" select="0"/>
  <xsl:param name="col3" select="0"/>

  <xsl:variable name="cellsBefore2">
    <xsl:choose>
      <xsl:when test="$col1 > 0">0</xsl:when>
      <xsl:otherwise>1</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="cellsBefore3">
    <xsl:choose>
      <xsl:when test="$col2 > 0">
        <xsl:value-of select="$cellsBefore2"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$cellsBefore2 + 1"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <row>
    <xsl:if test="$col1 = 0">
      <entry colname="1">
        <xsl:value-of select="$rows[$index]/CELL[1]/text()"/>
      </entry>
    </xsl:if>
    <xsl:if test="$col2 = 0">
      <entry colname="2">
        <xsl:value-of select="$rows[$index]/CELL[$cellsBefore2 + 1]/text()"/>
      </entry>
    </xsl:if>
    <xsl:if test="$col3 = 0">
      <entry colname="3">
        <xsl:value-of select="$rows[$index]/CELL[$cellsBefore3 + 1]/text()"/>
      </entry>
    </xsl:if>
  </row>
  <xsl:if test="$index &lt; count($rows)">
    <xsl:call-template name="processRows">
      <xsl:with-param name="rows" select="$rows"/>
      <xsl:with-param name="index" select="$index + 1"/>
      <xsl:with-param name="col1">
        <xsl:choose>
          <xsl:when test="$col1 > 0">
            <xsl:value-of select="$col1 - 1"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="number($rows[$index]/CELL[1]/@ROWSPAN) - 1"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:with-param>
      <xsl:with-param name="col2">
        <xsl:choose>
          <xsl:when test="$col2 > 0">
            <xsl:value-of select="$col2 - 1"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="number($rows[$index]/CELL[$cellsBefore2 + 1]/@ROWSPAN) - 1"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:with-param>
      <xsl:with-param name="col3">
        <xsl:choose>
          <xsl:when test="$col3 > 0">
            <xsl:value-of select="$col3 - 1"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="number($rows[$index]/CELL[$cellsBefore3 + 1]/@ROWSPAN) - 1"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:with-param>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

如你所看到,问题是栏数难以编码。 如果你想要有任意数目的栏目,那么你就必须能够编制和通过一个任意长度清单,作为参数。 只有在XSLT2.0中才能做到这一点。 然而,如果你在XSLT 1.1上重新编号,你就可以使用EXSLT(如果在你的环境中提供),将清单作为结果写成一个变数的树木,并在这一变量上使用外壳:即(no)来获得一个可使用的清单。





相关问题
how to represent it in dtd?

I have two element action and guid. guid is a required field when action is add. but when action is del it will not appear in file. How to represent this in dtd ?

.Net application configuration add xml-data

I need to add xml-content to my application configuration file. Is there a way to add it directly to the appSettings section or do I need to implement a configSection? Is it possible to add the xml ...

XStream serializing collections

I have a class structure that I would like to serialize with Xstream. The root class contains a collection of other objects (of varying types). I would like to only serialize part of the objects that ...

MS Word splits words in its XML format

I have a Word 2003 document saved as a XML in WordProcessingML format. It contains few placeholders which will be dynamically replaced by an appropriate content. But, the problem is that Word ...

Merging an XML file with a list of changes

I have two XML files that are generated by another application I have no control over. The first is a settings file, and the second is a list of changes that should be applied to the first. Main ...

How do I check if a node has no siblings?

I have a org.w3c.dom.Node object. I would like to see if it has any other siblings. Here s what I have tried: Node sibling = node.getNextSibling(); if(sibling == null) return true; else ...

Ordering a hash to xml: Rails

I m building an xml document from a hash. The xml attributes need to be in order. How can this be accomplished? hash.to_xml

热门标签