xsl cals表:span单元格,使用colspec,namest和nameend

时间:2013-12-05 18:54:41

标签: xml xslt xpath xsl-fo cals-tables

我越来越疯狂地使用桌子的单元格。 我的表有3列。下面你看到一行(只有片段):

<tgroup>
    <colspec name="x">
    <colspec name="y">
    <colspec name="z">
    <tbody>
        <row>
        <entry>abc
        <entry namest="y" nameend="z">blabla

第二个条目(blabla)应该跨越两个条目(=表格单元格)。信息位于“nameend”和“namest”属性中。

我的方式是:

  1. xsl:template match="entry" ...

  2. 获取<colspec name=z>(此处为3)和<colspec name="y">(此处为2)的位置编号     <??????>

  3. substract z和y(= 1)add 1:result = 3

      <xsl:param name="colspan">
          <xsl:value-of select="($nameend)-($namest)+(1)"/>
      </xsl:param>
    
  4. 在条目模板中使用result = 3作为属性“colspan”

    <fo:table-cell number-columns-spanned="{$colspan}" 
    
  5. 但我认为无法解决我的第二步(????)

    任何想法? 谢谢Pia

    P.S。不,我无法更改源文件

1 个答案:

答案 0 :(得分:4)

鉴于此输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<tgroup>
  <colspec name="x"/>
  <colspec name="y"/>
  <colspec name="z"/>
  <tbody>
    <row>
      <entry>abc</entry>
      <entry namest="y" nameend="z">blabla 1</entry>
    </row>
    <row>
      <entry namest="x" nameend="z">blabla 2</entry>
    </row>
    <row>
      <entry namest="x" nameend="y">blabla 3</entry>
      <entry>cde</entry>
    </row>
  </tbody>
</tgroup>

此XSLT:

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

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="entry[@namest and @nameend]">
    <xsl:variable name="namest" select="@namest"/>
    <xsl:variable name="nameend" select="@nameend"/>
    <xsl:variable name="namestPos" select="count(ancestor::tgroup/colspec[@name=$namest]/preceding-sibling::colspec)"/>
    <xsl:variable name="nameendPos" select="count(ancestor::tgroup/colspec[@name=$nameend]/preceding-sibling::colspec)"/>

    <table-cell number-columns-spanned="{$nameendPos - $namestPos + 1}">
      <xsl:apply-templates/>
    </table-cell>
  </xsl:template>
</xsl:stylesheet>

将产生此输出:

<?xml version="1.0" encoding="UTF-8"?>
<tgroup>
  <colspec name="x"/>
  <colspec name="y"/>
  <colspec name="z"/>
  <tbody>
      <row>
         <entry>abc</entry>
         <table-cell number-columns-spanned="2">blabla 1</table-cell>
      </row>
      <row>
         <table-cell number-columns-spanned="3">blabla 2</table-cell>
      </row>
      <row>
         <table-cell number-columns-spanned="2">blabla 3</table-cell>
         <entry>cde</entry>
      </row>
  </tbody>
</tgroup>

备注:

  • 虽然你写道,“减去z和y(= 1)加1:结果= 3”,我假设 你的意思是“结果= 2”。
  • entry已根据需要映射到table-cell @number-columns-spanned属性值,这是问题的关键方面。重新映射 周围的元素和映射到fo命名空间的工作仍有待完成。