XSLT中的网格表格式

时间:2015-12-22 12:42:17

标签: xslt xsl-fo

我有以下XML:

<Pattern name="Form" Date="12/18/2015 3:25 AM CST">
  Swap_Conversion 
  <CurrentLocale /> 
  <Patterns>
    <Pattern name="Section">
      Swap_Conversion 
      <Patterns>
        <Pattern name="GroupResult" status="AUTH" inputType="19">
          Ultrasound Duration 
          <Patterns>
            <Pattern name="GridDTA">23350691</Pattern> 
            <Pattern name="GridDTA">56468381</Pattern> 
            <Pattern name="GridDTA">20218422</Pattern> 
            <Pattern name="GridDTA">21058661</Pattern> 
            <Pattern name="GridDTA">4156900</Pattern> 
            <Pattern name="GridDTA">20008930</Pattern> 
            <Pattern name="GridDTA">21197198</Pattern> 
         </Patterns>
         <Patterns>
           <Pattern name="GroupResult" status="AUTH" inputType="">
              Ear Irrigation Solution 
              <Patterns /> 
              <Patterns>
                <Pattern name="CodedResult" status="AUTH" display="Ace Bandage :" taskAssayCode="23350691">2 inch</Pattern> 
              </Patterns>
           </Pattern>
        </Patterns>
        <Patterns>
          <Pattern name="GroupResult" status="AUTH" inputType="">
            Frame Order Priority 
            <Patterns /> 
            <Patterns>
              <Pattern name="CodedResult" status="AUTH" display="Ace Bandage :" taskAssayCode="23350691">3 inch</Pattern> 
            </Patterns>
          </Pattern>
        </Patterns>
       </Pattern>
     </Patterns>
    </Pattern>
  </Patterns>
</Pattern

目前我的转置看起来像:

This is the transpose of grid

但我希望它看起来像:

This is without transposing

目前我曾尝试使用transpose:

            <xsl:choose>
          <xsl:when test="$inputType='19'"
            <xsl:variable name="groupNodeSet" select="Patterns/Pattern[@name='GroupResult']"/>
            <xsl:for-each select="$groupNodeSet[position() &lt;= ((last() + $tablecolumns - 1) div $tablecolumns)]">
              <!-- loopCount indicates which table of the multiple tables that a grid control may be split into that we are currently generating-->
              <xsl:variable name="loopCount" select="position()"/>
              <fo:table border="1pt solid black">
                <fo:table-column/>
                <fo:table-column/>
                <fo:table-column/>
                <fo:table-body>
                  <fo:table-row>
                    <fo:table-cell border-width="thin">
                      <fo:block/>
                    </fo:table-cell>
                    <fo:table-cell>
                      <xsl:if test="$groupNodeSet[position()=((($loopCount - 1) * $tablecolumns) + 1)]">
                        <xsl:attribute name="border-width">
                          <xsl:text>thin</xsl:text>
                        </xsl:attribute>
                      </xsl:if>
                      <fo:block font-size="{$regularfontsize}" font-family="sans-serif" text-align="left" font-style="italic">
                        <xsl:value-of select="$groupNodeSet[position()=((($loopCount - 1) * $tablecolumns) + 1)]/text()"/>
                      </fo:block>
                    </fo:table-cell>
                    <fo:table-cell>
                      <xsl:if test="$groupNodeSet[position()=((($loopCount - 1) * $tablecolumns) + 2)]">
                        <xsl:attribute name="border-width">
                          <xsl:text>thin</xsl:text>
                        </xsl:attribute>
                      </xsl:if>
                      <fo:block font-size="{$regularfontsize}" font-family="sans-serif" text-align="left" font-style="italic">
                        <xsl:value-of select="$groupNodeSet[position()=((($loopCount - 1) * $tablecolumns) + 2)]/text()"/>
                      </fo:block>
                    </fo:table-cell>
                  </fo:table-row>
                  <xsl:for-each select="../../Patterns/Pattern[@name='GridDTA' and ../..//@taskAssayCode=text()]">
                    <xsl:variable name="taskassay">
                      <xsl:value-of select="node()"/>
                    </xsl:variable>
                    <fo:table-row>
                      <fo:table-cell border-width="thin">
                        <fo:block>
                          <xsl:value-of select="../..//Pattern/@display[../..//Pattern/@taskAssayCode=$taskassay]"/>
                        </fo:block>
                      </fo:table-cell>
                      <xsl:call-template name="GenerateGridTableCells">
                        <xsl:with-param name="count" select="1"/>
                        <xsl:with-param name="maxcount" select="$tablecolumns"/>
                        <xsl:with-param name="taskassay" select="$taskassay"/>
                        <xsl:with-param name="groupNodeSet" select="$groupNodeSet"/>
                        <xsl:with-param name="rowNumber" select="$loopCount"/>
                      </xsl:call-template>
                    </fo:table-row>
                  </xsl:for-each>
                </fo:table-body>
              </fo:table>
            </xsl:for-each>
          </xsl:when>
        </xsl:choose>

我尝试了多种方法,而不是普通的方法(不是转置)。

任何人都可以帮助我使用网格矩阵而无需转置上述XML吗?

1 个答案:

答案 0 :(得分:0)

由于您使用的是XSLT 1.0,因此您仍然坚持使用Meunchian分组(muenchian groupinghttp://www.jenitennison.com/xslt/grouping/muenchian.html)。使用XSLT 2.0会更容易。

以下版本可以应对CodedResult&#39;在每个&#39; GroupResult&#39;。

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0"
    xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <xsl:variable name="regularfontsize" select="'12pt'"/>

  <xsl:output indent="yes" />

  <xsl:key name="coded-results"
           match="Pattern[@name = 'CodedResult'][@status = 'AUTH']"
           use="@display" />

  <xsl:template match="/">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
      xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions">
      <fo:layout-master-set>
        <fo:simple-page-master master-name="a">
          <fo:region-body/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="a">
        <fo:flow flow-name="xsl-region-body">
          <xsl:apply-templates select="Pattern/Patterns/Pattern[@name = 'Section']/Patterns/Pattern" />
        </fo:flow>
      </fo:page-sequence>
    </fo:root>

  </xsl:template>

  <xsl:variable name="inputType" select="'19'" />

  <xsl:template match="Pattern[@inputType = '19']">
    <xsl:variable name="all-coded-results"
      select="Patterns/Pattern[@inputType = '']/Patterns/Pattern[@name = 'CodedResult']
                                                                       [count(. | key('coded-results', @display)[1]) = 1]" />
    <fo:table border="1pt solid black">
      <fo:table-column/>
      <xsl:for-each
          select="$all-coded-results">
        <fo:table-column/>
      </xsl:for-each>
      <fo:table-body>
        <fo:table-row>
          <fo:table-cell />
          <xsl:for-each
              select="$all-coded-results">
            <xsl:sort />
            <fo:table-cell>
              <fo:block>
                <xsl:value-of select="@display" />
              </fo:block>
            </fo:table-cell>
          </xsl:for-each>
        </fo:table-row>
        <xsl:apply-templates select="Patterns/Pattern[@name = 'GroupResult']">
          <xsl:with-param name="all-coded-results" select="$all-coded-results" />
        </xsl:apply-templates>
      </fo:table-body>
    </fo:table>
  </xsl:template>

  <xsl:template match="Pattern[@name = 'GroupResult'][@inputType = '']">
    <xsl:param name="all-coded-results" />
    <fo:table-row>
      <fo:table-cell>
        <fo:block>
          <xsl:value-of select="normalize-space(text())" />
        </fo:block>
      </fo:table-cell>
      <xsl:variable name="this-pattern" select="." />
      <xsl:for-each
          select="$all-coded-results">
        <xsl:sort />
        <xsl:variable name="this-result" select="."/>
        <fo:table-cell>
          <xsl:if test="$this-pattern/Patterns/Pattern[@display = $this-result/@display]">
          <fo:block>
            <xsl:value-of select="$this-pattern/Patterns/Pattern[@display = $this-result/@display]" />
          </fo:block>
          </xsl:if>
        </fo:table-cell>
      </xsl:for-each>
    </fo:table-row>
  </xsl:template>
</xsl:stylesheet>