如何动态地为XSL FO中的特定列组生成嵌套列



我有一个XSLT 1.0样式表,它为下面的XML生成一个包含多列和多行的表。我想要的输出是为一组列创建一个嵌套的父列,让我说在我的XML中,3列('PromotionInd', 'BrkChgID', 'BrkChgAmt')需要嵌套在一个父列'Brokerage'如下图所示。期望的嵌套列布局图

下面是我的XML和XSLT。你能指导我如何做到这一点吗?

XML数据

     <PdfPrinter>
     <Reports>
     <Report>
     <BatchDate>2016-08-10T00:00:00</BatchDate>
     <ClientAccountNo>ABCDE01384</ClientAccountNo>
     <Source>N</Source>
     <CDSNo>0000001387</CDSNo>
     <Price>0.123000</Price>
     <Qty>-1200</Qty>
     <TCurrency>USD</TCurrency>
     <TNettAmt>0</TNettAmt>
     <LCurrency>USD</LCurrency>
     <LNettAmt>-86.600000</LNettAmt>
     <PromotionInd>N</PromotionInd>
     <BrkChgID>BRK-N</BrkChgID>
     <BrkChgAmt>50.000000</BrkChgAmt>
     <ClrChgID>CLR</ClrChgID>
     <ClrChgAmt>10.000000</ClrChgAmt>
     <SdcChgID>SDC</SdcChgID>
     <SdcChgAmt>1.000000</SdcChgAmt>
     <BinChgID />
     <BinChgAmt>0</BinChgAmt>
     <OthChgAmt>0.000000</OthChgAmt>
     <TaxAmt>0.000000</TaxAmt>
     </Report>
     <Report>
     <BatchDate>2016-08-10T00:00:00</BatchDate>
     <ClientAccountNo />
     <Source>N</Source>
     <CDSNo />
     <Price>0.123000</Price>
     <Qty>1200</Qty>
     <TCurrency>USD</TCurrency>
     <TNettAmt>0</TNettAmt>
     <LCurrency>USD</LCurrency>
     <LNettAmt>147.600000</LNettAmt>
     <PromotionInd>N</PromotionInd>
     <BrkChgID />
     <BrkChgAmt>0</BrkChgAmt>
     <ClrChgID />
     <ClrChgAmt>0</ClrChgAmt>
     <SdcChgID />
     <SdcChgAmt>0</SdcChgAmt>
     <BinChgID />
     <BinChgAmt>0</BinChgAmt>
     <OthChgAmt>0</OthChgAmt>
     <TaxAmt>0</TaxAmt>
     </Report>
     <Report>
     <BatchDate>2016-08-10T00:00:00</BatchDate>
     <ClientAccountNo>ABCDE00003</ClientAccountNo>
     <Source>N</Source>
     <CDSNo>0000000003</CDSNo>
     <Price>1.589000</Price>
     <Qty>-2000</Qty>
     <TCurrency>USD</TCurrency>
     <TNettAmt>0</TNettAmt>
     <LCurrency>USD</LCurrency>
     <LNettAmt>-3114.820000</LNettAmt>
     <PromotionInd>N</PromotionInd>
     <BrkChgID>BRK-N</BrkChgID>
     <BrkChgAmt>50.000000</BrkChgAmt>
     <ClrChgID>CLR</ClrChgID>
     <ClrChgAmt>10.000000</ClrChgAmt>
     <SdcChgID>SDC</SdcChgID>
     <SdcChgAmt>3.180000</SdcChgAmt>
     <BinChgID />
     <BinChgAmt>0</BinChgAmt>
     <OthChgAmt>0.000000</OthChgAmt>
     <TaxAmt>0.000000</TaxAmt>
    </Report>
    </Reports>
    </PdfPrinter> 

EDIT:完成XSLT 1.0模板

       <xsl:stylesheet
        version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       xmlns:msxsl="urn:schemas-microsoft-com:xslt"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:ext="http://exslt.org/common"
       xmlns:utilityExtension="pdfprinter:extensions:utility"
       exclude-result-prefixes="msxsl utilityExtension">
      <xsl:output method="xml" indent="yes" 
      omit-xml-declaration="yes" encoding="utf-8"/>
     <xsl:template match="/">
     <xsl:variable name="PromotionInd" select="/PdfPrinter/
      Reports/Report/PromotionInd" />
    <xsl:variable name="ClrChgID" 
    select="/PdfPrinter/Reports/Report/ClrChgID"/>
<xsl:variable name="Brokerage">Brokerage</xsl:variable>
<xsl:variable name="ClearingFee">Clearing Fee</xsl:variable>
<xsl:variable name="columnFontSize">12pt</xsl:variable>
<xsl:variable name="columnFontType">Helvetica</xsl:variable>
<xsl:variable name="headerOrgName">Pavan</xsl:variable>
<xsl:variable name="headerPrintedBy">Printed By</xsl:variable>
<xsl:variable name="headerPrintedDate">Printed Date</xsl:variable>
<xsl:variable name="headerReportID">Report ID</xsl:variable>
<xsl:variable name="headerLogo" select="
 utilityExtension:MapPath('~/App_Data/Resources/IMAGES/logo.jpg')"/>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <!-- defines the layout master -->
  <fo:layout-master-set>
    <fo:simple-page-master master-name="all-pages" page-width="894mm" page-height="1300pt" margin-top="10mm" margin-left="20mm" margin-right="20mm" margin-bottom="10mm">
      <fo:region-body region-name="xsl-region-body" column-gap="0in" margin="0.8in" margin-left="0.7in" margin-top="2.3in" margin-bottom="1.8in" padding-top="0in"/>
      <fo:region-before region-name="xsl-region-before" extent="75mm" />
      <fo:region-after region-name="xsl-region-after" extent="7in"/>
    </fo:simple-page-master>
    <fo:page-sequence-master master-name="default-sequence">
      <fo:single-page-master-reference master-reference="all-pages"/>
      <fo:repeatable-page-master-reference  master-reference="all-pages" />
    </fo:page-sequence-master>
  </fo:layout-master-set>
  <!-- starts actual layout -->
  <fo:page-sequence master-reference="default-sequence" initial-page-number="1" id="last-page">
    <fo:static-content flow-name="xsl-region-before" width="100%" border-top-style="solid" border-top-color="rgb(192,192,192)" padding-top="1pt">
      <fo:block>
        <fo:table border-collapse="collapse" width="100%" table-layout="fixed" margin-top="-0.002in" padding-left="0.7in" margin-left="0in" border-spacing="5px" space-before.conditionality="retain" space-after.conditionality="retain" space-after="1em" space-before="1em">
          <fo:table-column column-width="proportional-column-width(55)" column-number="1"/>
          <fo:table-column column-width="proportional-column-width(45)" column-number="2"/>
          <fo:table-column column-width="proportional-column-width(45)" column-number="3"/>
          <fo:table-column column-width="proportional-column-width(45)" column-number="4"/>
          <fo:table-column column-width="proportional-column-width(45)" column-number="5"/>
          <fo:table-body>
            <fo:table-row>
              <fo:table-cell width="50%" text-align="left" padding-left="2pt">
                <fo:block color="rgb(0,0,128)" font-size="16pt" font-weight="bold">&#160;</fo:block>
                <fo:block color="rgb(0,0,128)" font-weight="bold"></fo:block>
                <fo:block padding-left="0in">
                  <fo:external-graphic src="{$headerLogo}"/>&#160;&#160;&#160;&#160;
                  <fo:block>
                  </fo:block>
                </fo:block>
                <fo:block color="rgb(0,0,128)" font-weight="bold">&#160;&#160;&#160;&#160;</fo:block>
                <fo:block color="rgb(0,0,0)" font-weight="bold" font-family="{$columnFontType}" font-size="{$columnFontSize}">
                  <xsl:value-of select="$headerReportID"/> : <xsl:value-of select="/PdfPrinter/Reports/Header/ReportID" />
                </fo:block>
              </fo:table-cell>
              <fo:table-cell></fo:table-cell>
              <fo:table-cell></fo:table-cell>
              <fo:table-cell></fo:table-cell>
              <fo:table-cell width="100%" text-align="left">
                <fo:block>&#160;&#160;&#160;&#160;</fo:block>
                <fo:block>&#160;&#160;&#160;&#160;</fo:block>
                <fo:block>&#160;&#160;&#160;&#160;</fo:block>
                <fo:block>&#160;&#160;&#160;&#160;</fo:block>
                <fo:block>&#160;&#160;&#160;&#160;</fo:block>
                <fo:block text-align="left">
                  <fo:inline font-weight="bold" font-family="{$columnFontType}" font-size="{$columnFontSize}">
                    Page <fo:page-number/> of <fo:page-number-citation ref-id="last-page"/>
                  </fo:inline>
                </fo:block>
                <fo:block text-align="left">
                  <fo:inline font-weight="bold" font-family="{$columnFontType}" font-size="{$columnFontSize}">
                    <xsl:value-of select="$headerPrintedBy"/>  : <xsl:value-of select="$n"/>
                  </fo:inline>
                </fo:block>
                <fo:block text-align="left">
                  <fo:inline font-weight="bold" font-family="{$columnFontType}" font-size="{$columnFontSize}">
                    <xsl:value-of select="$headerPrintedDate"/>  :  <xsl:value-of select="/PdfPrinter/Reports/Header/PrintedDate" />
                  </fo:inline>
                </fo:block>
              </fo:table-cell>
            </fo:table-row>
          </fo:table-body>
        </fo:table>
        <fo:block/>
      </fo:block>
      <fo:block text-align="center">
        <fo:table padding-left="0.7in" border-bottom-width="5pt" border-width="1pt" font-weight="bold" inline-progression-dimension="auto" width="100%">
          <fo:table-column column-number="1"/>
          <fo:table-body>
            <fo:table-row border-bottom-color="rgb(0,0,255)" display-align="before">
              <fo:table-cell border-bottom-width="3pt" border-bottom-style="solid" border-bottom-color="rgb(255,255,255)" padding="2pt" text-align="left">
                <fo:block text-align="center" font-size="13pt" font-weight="bold" font-family="Helvetica" border-bottom="10pt  "></fo:block>
                <fo:block>
                  <xsl:value-of select="/PdfPrinter/Reports/Header/ReportTitle" />
                </fo:block>
                <fo:block border-bottom-width="8pt" text-align="center" background-color="black"/>
              </fo:table-cell>
            </fo:table-row>
          </fo:table-body>
        </fo:table>
      </fo:block>
    </fo:static-content>
    <fo:flow flow-name="xsl-region-body">
      <fo:block text-align="center">
        <!-- table start -->
        <fo:table role="html:table" table-layout="auto" inline-progression-dimension="auto" line-height="2.5" width="100%" border="0px" border-collapse="collapse" border-spacing="3px" border-style="outset hidden" space-before.conditionality="retain" space-after.conditionality="retain" space-after="1em" space-before="1em">
          <!--table header-->
          <xsl:for-each select="/PdfPrinter/Reports/Report[1]/*">
            <fo:table-column column-width="proportional-column-width(4.77)" />
          </xsl:for-each>
          <fo:table-header>
            <fo:table-row height="auto" color="#FFFFFF" background-color="#A1A1A1" text-align="center" font-weight="bold" font-family="Helvetica" font-size="medium">
                <xsl:choose>
                <xsl:when test="$PromotionInd">
                  <fo:table-cell text-align="center">
                    <fo:block font-size="13pt" font-family="Helvetica">
                      <xsl:value-of select="$Brokerage"/>
                    </fo:block>
                  </fo:table-cell>
                </xsl:when>
              </xsl:choose>
              <xsl:choose>
                <xsl:when test="$ClrChgID">
                  <fo:table-cell text-align="center">
                    <fo:block font-size="13pt" font-family="Helvetica">
                      <xsl:value-of select="$ClearingFee"/>
                    </fo:block>
                  </fo:table-cell>
                </xsl:when>
              </xsl:choose>
            </fo:table-row>
            <fo:table-row height="auto" color="#FFFFFF" background-color="#A1A1A1" text-align="center" font-weight="bold" font-family="Helvetica" font-size="medium">
              <xsl:for-each select="/PdfPrinter/Reports/Report[1]/*">
                <fo:table-cell text-align="center">
                  <fo:block font-size="13pt" font-family="Helvetica">
                    <xsl:value-of select="name()"/>
                  </fo:block>
                </fo:table-cell>
              </xsl:for-each>
            </fo:table-row>
          </fo:table-header>
          <!--table body-->
          <fo:table-body>
            <xsl:for-each select="PdfPrinter/Reports/Report">
              <fo:table-row display-align="before">
                <xsl:for-each select="*">
                  <fo:table-cell text-align="center" border-top-color="rgb(255, 255, 255)" border-top-style="solid" border-width="1pt" padding="2pt">
                    <fo:block font-size="13pt" font-family="Helvetica">
                      <xsl:value-of select="."/>
                    </fo:block>
                  </fo:table-cell>
                </xsl:for-each>
              </fo:table-row>
            </xsl:for-each>
          </fo:table-body>
        </fo:table>
        <!-- table end -->
      </fo:block>
      <fo:block id="last-page"/>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

我可以用下面的逻辑解决这个问题。

     <fo:table-row height="auto" color="#FFFFFF" background-color="#A1A1A1" text-align="center" font-weight="bold" font-family="Helvetica" font-size="medium">
              <xsl:choose>
                <xsl:when test="/PdfPrinter/Reports/Report[1]/*[local-name()='BrkChgID']">
                   <fo:table-cell text-align="center" column-number="16" number-columns-spanned="3">
                   <fo:block font-size="13pt" font-family="Helvetica">
                      <xsl:value-of select="$Brokerage"/>
                   </fo:block>
                   </fo:table-cell>
                </xsl:when>
              </xsl:choose>
            </fo:table-row>

相关内容

  • 没有找到相关文章

最新更新