我对表的单元格变得疯狂。
我的桌子有3列。在下面,您会看到一行(仅是片段):

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


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

我的方式是:


xsl:template match="entry" ...
获取<colspec name=z>(此处为3)和<colspec name="y">(此处为2)的位置编号
<??????>
减去z和y(= 1)加1:结果= 3

  <xsl:param name="colspan">
      <xsl:value-of select="($nameend)-($namest)+(1)"/>
  </xsl:param>

在输入模板中将result = 3用作属性“ colspan”

<fo:table-cell number-columns-spanned="{$colspan}"



但是我看不到解决第二步的方法(????)

有任何想法吗??
谢谢皮亚

附言不,我不能更改源文件

最佳答案

给定此输入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命名空间的工作也要做。

09-11 17:20