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

时间:2015-06-16 14:43:15

标签: xml xslt xsl-fo tablerow

我有一个具有不同属性列表的数据集(大约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>

我想为这个动态表构建一个具有备用行颜色的fo:表。我尝试过使用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>

2 个答案:

答案 0 :(得分:1)

您发布的代码示例还不够。我们不了解背景。可重复的东西(我们可以运行的东西)是理想的。

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

您可以使用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)

enter image description here

答案 1 :(得分:0)

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