在XML CALS-Table中添加indesign单元格样式?

时间:2012-12-14 16:02:15

标签: xml xslt html-table adobe-indesign

我有一个带有CALS表的XML文件,我想将其导入到indesign中。 问题是,indesign中的实际表定义了一些单元格样式,并且indesign不允许将标记(以及样式)添加到CALS表(仅限于设置表)。

我的xml看起来像这样

<table>
<tgroup cols="6">
<colspec colname="c1" colwidth="29pt"/>
<colspec colname="c2" colwidth="172pt"/>
<colspec colname="c3" colwidth="71pt"/>
<colspec colname="c4" colwidth="69pt"/>
<colspec colname="c5" colwidth="113pt"/>
<colspec colname="c6" colwidth="69pt"/>
<thead>
<row>
<entry align="left" colsep="0" valign="bottom">Tag</entry>
<entry align="left" colsep="0" valign="bottom">Datum</entry>
<entry align="left" colsep="0" valign="bottom">Zeit</entry>
<entry align="left" colsep="0" valign="bottom">Ort</entry>
<entry align="left" colsep="0" valign="bottom">Leitung</entry>
<entry align="left" colsep="0" valign="bottom">Kursnummer</entry>
</row>
</thead>
<tbody>
<row>
<entry colsep="0">Mi</entry>
<entry colsep="0" valign="bottom">15.03.2012, 16.03.2012, 17.03.2012</entry>
<entry colsep="0" valign="bottom">10:15 - 11:45</entry>
<entry colsep="0" valign="bottom">someplace</entry>
<entry colsep="0" valign="bottom">some Name</entry>
<entry colsep="0" valign="bottom">ABC-DE-12</entry>
</row>
<row>
<entry colsep="0">Mi</entry>
<entry colsep="0" valign="bottom">15.06.2012, 16.06.2012, 17.06.2012</entry>
<entry colsep="0" valign="bottom">09:15 - 10:45</entry>
<entry colsep="0" valign="bottom">otherplace</entry>
<entry colsep="0" valign="bottom">other Name</entry>
<entry colsep="0" valign="bottom">XYZ-U-K-13</entry>
</row>
</tbody>
</tgroup>
</table>

当我导入这个时,我得到一个带有一些黑色边框的标准表格,并且字体大小错误。我还在细胞样式中添加了一些细节(即彩色边框底部0.5pt)。如果我可以在indesign中完成所有样式,那就太棒了。我真的不喜欢在xml中设置colwidth,但我理解为什么我必须这样做...

我听说有xslt或idml的解决方案,但我对两者都不熟悉...... 是否有一个简单的解决方案来添加单元格样式(一个用于<tbody>,一个用于<thead>)?

同样的问题适用于表格样式(不需要这个,但也许我以后需要它......)

2 个答案:

答案 0 :(得分:1)

对于任何仍在寻找的人 - 有一个单独的aid5:名称空间允许单元格样式。您可以在表标记属性中组合2个名称空间,如下面的示例所示,以利用aid:和aid5:attributes ...也使用表格样式,您只需将表格标记“命名”为独特的名称,并使用该名称将标记映射到Indesign文件中的样式。命名表标签和misc。命名标记必须手动映射(表格的表格样式,或其他格式的字符样式),而标签中的cellstyle,pstyle(段落样式)和cstyle(字符样式)属性 地图只要你有一个段落,单元格或字符样式与完全相同的区分大小写的名称。如果您可以在Indesign模板中拥有占位符表(带有标题行和一个正文行),则可以放弃使用宽度。可以使用自闭标签跳过任何预先填充的单元格(如标题行),如下所示。最后,如果您不知道您将拥有多少行,只需将每个重复行设置为只有一行的完整表。不理想,在我的例子中,我们使用变量来填充辅助:trows属性。正在为我们提供数据计算行数的前端(编辑,修复了错误的列数和添加的缩进)。

    <!-- table with widths declared -->
    <myTableStyleName xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/" xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/" aid:table="table" aid:trows="3" aid:tcols="2">
        <Cell aid:table="cell" aid:ccolwidth="200" aid:theader="" aid:crows="1" aid:ccols="1" aid5:cellstyle="headerCell" aid:pstyle="headerCellP">column one header</Cell>
        <Cell aid:table="cell" aid:ccolwidth="200" aid:theader="" aid:crows="1" aid:ccols="1" aid5:cellstyle="headerCell" aid:pstyle="headerCellP">column two header</Cell>
        <Cell aid:table="cell" aid:ccolwidth="200" aid:crows="1" aid:ccols="1" aid5:cellstyle="bodyCellA" aid:pstyle="paragraphAwayGame">row 1 col 1</Cell>
        <Cell aid:table="cell" aid:ccolwidth="200" aid:crows="1" aid:ccols="1" aid5:cellstyle="bodyCellA" aid:pstyle="paragraphHomeGame">row 1 col 2 <myCharStyle>WE WON!</myCharStyle></Cell>
        <Cell aid:table="cell" aid:ccolwidth="200" aid:crows="1" aid:ccols="1" aid5:cellstyle="bodyCellA" aid:pstyle="paragraphAwayGame">row 2 col 1</Cell>
        <Cell aid:table="cell" aid:ccolwidth="200" aid:crows="1" aid:ccols="1" aid5:cellstyle="bodyCellA" aid:pstyle="paragraphHomeGame">row 2 col 2</Cell>
    </myTableStyleName>

    <!-- table data populating starter rows in Indesign, no widths needed -->
    <Table xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/" xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/" aid:table="table" aid:trows="3" aid:tcols="2">
        <Cell aid:table="cell" aid:theader="" aid:crows="1" aid:ccols="1" aid5:cellstyle="headerCell" aid:pstyle="headerCellP"/>
        <Cell aid:table="cell" aid:theader="" aid:crows="1" aid:ccols="1" aid5:cellstyle="headerCell" aid:pstyle="headerCellP"/>
        <Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid5:cellstyle="bodyCellA" aid:pstyle="paragraphAwayGame">row 1 col 1</Cell>
        <Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid5:cellstyle="bodyCellA" aid:pstyle="paragraphHomeGame">row 1 col 2</Cell>
        <Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid5:cellstyle="bodyCellA" aid:pstyle="paragraphAwayGame">row 2 col 1</Cell>
        <Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid5:cellstyle="bodyCellA" aid:pstyle="paragraphHomeGame">row 2 col 2</Cell>
    </Table>

答案 1 :(得分:0)

  1. 您必须使用一些示例数据
  2. 在InDesign中设计表格外观
  3. 标记示例表的内容
  4. 使用XML-Export功能导出样本表
  5. 根据示例xml-data,您可以为cals-table
  6. 编写转换
  7. 使用indesign xslt选项导入Cals数据
  8. 如果你不是那么有经验,那么最棘手的部分可能就是为表标签及其属性提供正确的命名空间:

    xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/"
    

    以下是一个示例XSLT样式表,用于将数据转换为带有单元格样式的indesign表:

    <xsl:stylesheet 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/"
    xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/"
    exclude-result-prefixes="xs">
    
    <xsl:output indent="yes" encoding="UTF-8" standalone="yes" />
    <xsl:strip-space elements="table thead tbody row entry" />
    
    <xsl:variable name="tcols"><xsl:value-of select="table/tgroup/@cols" /></xsl:variable>
    <xsl:variable name="trows"><xsl:value-of select="ceiling ( ( count(table/tgroup/thead/row/entry) + count(table/tgroup/tbody/row/entry) ) div $tcols )" /></xsl:variable>
    
    <xsl:template match="/">
        <xsl:processing-instruction name="whitespace-handling">
            <xsl:text>use-tags</xsl:text>
        </xsl:processing-instruction>
        <table aid:table="table" aid:trows="{$trows}" aid:tcols="{$tcols}">
            <xsl:apply-templates select="table/tgroup/thead/row" />
            <xsl:apply-templates select="table/tgroup/tbody/row" />    
        </table>
    </xsl:template>
    
    <xsl:template match="thead/row/entry | tbody/row/entry">
        <cell aid:table="cell" aid:crows="1" aid:ccols="1">
            <xsl:if test="ancestor::thead">
                <xsl:attribute name="aid:theader" />
            </xsl:if>
            <!-- Here your style-definition based on something  -->
            <xsl:attribute name="aid5:cellstyle"><xsl:text>mycellstyle</xsl:text></xsl:attribute>
            <xsl:attribute name="aid:ccolwidth">
                <xsl:call-template name="getcolwidth">
                    <xsl:with-param name="position">
                        <xsl:value-of select="position()" />
                    </xsl:with-param>
                </xsl:call-template>
            </xsl:attribute>
            <xsl:value-of select="." />
        </cell>
    </xsl:template>
    
    <xsl:template name="getcolwidth">
        <xsl:param name="position" />
        <xsl:for-each select="/table/tgroup/colspec">
            <xsl:if test="position() = $position">
                <xsl:value-of select="substring-before(@colwidth, 'pt')" />
            </xsl:if>
        </xsl:for-each>
    </xsl:template>