如何在没有 xsl:for-each 的情况下在 XSL:FO 中动态生成行颜色

How to dynamically generate row color in XSL:FO without xsl:for-each

我有一个数据集,其中包含不同的属性列表(大约 15 个),如下所示。

示例数据 1:

<cd>
  <name>Tom</name>
  <address>Madison Square</address>
  <phone>000-000-0000</phone>
</cd>

示例数据 2:

<cd>
  <name>Tom</name>
  <city>New York</city>
  <phone>000-000-0000</phone>
</cd>

完整的属性列表(子集):

<cd>
   <name>xxx</name>
   <address>xxxx</address>
   <city>xxxx</city>
   <phone>000-000-0000</phone>
</cd>

我想为此动态 table 构建一个具有备用行颜色的 fo:table。我试过使用 xsl:for-each 和 position(),但它不起作用。有没有办法获取前一行的属性,比如颜色?任何建议。

添加代码供参考:

        <fo:table-row>
          <fo:table-cell padding-left="3pt" padding-top="8pt">
              <fo:block> <xsl:value-of select="cd/name"/></fo:block>               
           </fo:table-cell>
         </fo:table-row>
         <xsl:if test="normalize-space(cd/address) !=''">
           <fo:table-row background-color="#EEF0F2" >
             <fo:table-cell padding-left="3pt" padding-top="8pt">
               <fo:block> <xsl:value-of select="cd/address"/></fo:block>                   
             </fo:table-cell>
           </fo:table-row>
         </xsl:if>
         <xsl:if test="normalize-space(cd/city) !=''">
           <fo:table-row background-color="#EEF0F2" >
             <fo:table-cell padding-left="3pt" padding-top="8pt">
              <fo:block> <xsl:value-of select="cd/city"/></fo:block>                  
             </fo:table-cell>
           </fo:table-row>            
         </xsl:if>

Post 你的代码。在这种情况下,一种策略是首先在变量中构建 table,然后将其复制到输出,同时添加颜色标签。这可能不那么混乱。

您发布的代码示例还不够。我们不知道上下文。可复制的东西(我们可以运行)是理想的。

这是一个通用的答案,应该有所帮助。

您可以做的是使用 xsl:apply-templates 处理 cd 的非空子项。这会更改正在处理的节点集,并允许 position() 正常工作。

注意:您也可以使用 xsl:for-each 执行此操作。但是,如果您要将最简单的 XML 之外的任何内容转换为非常简单的 XSL-FO,您最好使用推送方法而不是拉取方法。这将使您的 XSLT 更易于维护和扩展。

然后您可以使用mod查看该位置是否可以被 2 整除。如果可以,请添加背景颜色。

示例:

XML 输入

<cd>
    <name>xxx</name>
    <address>xxxx</address>
    <city>xxx</city>
    <whatevs></whatevs>
    <phone>000-000-0000</phone>
</cd>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <fo:root>
            <fo:layout-master-set>
                <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in">
                    <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="my-page">
                <fo:flow flow-name="xsl-region-body"> 
                    <fo:table>
                        <fo:table-body>
                            <xsl:apply-templates select="cd/*[string()]"/>                            
                        </fo:table-body>
                    </fo:table>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>

    <xsl:template match="cd/*">
        <fo:table-row>            
            <xsl:if test="position() mod 2">
                <xsl:attribute name="background-color">
                    <xsl:text>#EEF0F2</xsl:text>
                </xsl:attribute>
            </xsl:if>
            <fo:table-cell padding-left="3pt" padding-top="8pt">
                <fo:block><xsl:value-of select="."/></fo:block>                  
            </fo:table-cell>
        </fo:table-row>
    </xsl:template>

</xsl:stylesheet>

XSL-FO 输出

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:layout-master-set>
      <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in">
         <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
      </fo:simple-page-master>
   </fo:layout-master-set>
   <fo:page-sequence master-reference="my-page">
      <fo:flow flow-name="xsl-region-body">
         <fo:table>
            <fo:table-body>
               <fo:table-row background-color="#EEF0F2">
                  <fo:table-cell padding-left="3pt" padding-top="8pt">
                     <fo:block>xxx</fo:block>
                  </fo:table-cell>
               </fo:table-row>
               <fo:table-row>
                  <fo:table-cell padding-left="3pt" padding-top="8pt">
                     <fo:block>xxxx</fo:block>
                  </fo:table-cell>
               </fo:table-row>
               <fo:table-row background-color="#EEF0F2">
                  <fo:table-cell padding-left="3pt" padding-top="8pt">
                     <fo:block>xxx</fo:block>
                  </fo:table-cell>
               </fo:table-row>
               <fo:table-row>
                  <fo:table-cell padding-left="3pt" padding-top="8pt">
                     <fo:block>000-000-0000</fo:block>
                  </fo:table-cell>
               </fo:table-row>
            </fo:table-body>
         </fo:table>
      </fo:flow>
   </fo:page-sequence>
</fo:root>

渲染的 PDF(使用 FOP 1.1)