在子级别上设置父属性

时间:2015-08-11 09:19:25

标签: xml xslt xsl-fo

我们的客户使用XSL FO生成PDF输出。他在表格中的描述存在问题,其中单元格在页面末端被拆分。限制是他使用XSL编辑器而不是直接XSL。此编辑器允许您添加XSL片段,但无法访问XSL的所有级别。

不使用编辑器切换到XSL不是一种选择。

在XSL中,一个简单的解决方案如下:

<fo:table-row>
<xsl:attribute name="keep-together.within-page">always</xsl:attribute>
<fo:table-cell>
</fo:table-cell>
</fo:table-row>

但是无法从编辑器访问表格行标签。我可以在表格单元格上设置它。这可能吗?

类似于:

<fo:table-row>
<fo:table-cell>
<xsl:attribute name="../keep-together.within-page">always</xsl:attribute>
</fo:table-cell>
</fo:table-row>

1 个答案:

答案 0 :(得分:0)

我不知道您的编辑器中可能的内容,但以下示例可能有所帮助:

<强> XML

<root>
    <row>
        <cell>Alpha</cell>
        <cell>Bravo</cell>
        <cell>Charlie</cell>
    </row>
    <row>
        <cell>Delta</cell>
        <cell>Echo</cell>
    </row>
</root>

<强> XSLT

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="cell[1]">
    <xsl:attribute name="add">True</xsl:attribute>
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

<强>结果

<root>
   <row add="True">
      <cell>Alpha</cell>
      <cell>Bravo</cell>
      <cell>Charlie</cell>
   </row>
   <row add="True">
      <cell>Delta</cell>
      <cell>Echo</cell>
   </row>
</root>

这是有效的,因为当第一个cell开始处理时,父row仍然没有孩子 - 所以仍然可以创建一个属性并让它采用&#34;采用&#34} 34;由父row

如果删除[1]谓词,则在处理行中第一个单元格之外的任何单元格时,将会出现"Cannot write an attribute node when no element start tag is open"行的错误。根据您的处理器,此错误可能是致命的。