xsl-list
[Top] [All Lists]

Re: too many columns

2002-10-24 01:03:27
Jarno(_dot_)Elovirta(_at_)nokia(_dot_)com wrote:
I have a xml/xsl duet where i would like to render multiple 
tables with the
info that is between the <Page></Page> tags as seen in the 
XML (source) here
http://65.104.178.73/print.xml

For future reference, it would probably be better if you posted a sample from 
your source that shows the problem, instead of pointing to a file on the net, 
so people won't have to wget it.

There's nothing wrong with posting a URL to the source. It's a not a large
file at all, but is larger than ought to be posted to the list.

One problem with the source, offhand, is that there are elements named
'XMLData' and 'XMLNodeName'. While this doesn't break well-formedness, it is
in violation of the XML 1.0 spec, because it starts with 'XML' yet isn't a
name standardized upon by the W3C. Choose a different name that does not start
with 'XML' (case-insensitive).

However, my column headers are rendered perfectly fine, but I 
have more columns that I need instead of having the first 
<Page></Page>table content
in the first table and the second <Page></Page> in the second table.

It is hard to explain but I guess seeing it will help you understand.

The stylesheet is here:
http://65.104.178.73/print.xsl

Anyhow, it seems that you're using the 
Microsoft-XSL-dialect-that-has-nothing-to-do-with-XSLT-1.0. Thus, you should 
either ask Microsoft for assistance or e.g. see Microsoft XSL FAQ 
<http://www.netcrucible.com/xslt/msxml-faq.htm>, or rewrite you stylesheet in 
XSLT 1.0, and come back if you're having problems with that.

I wasn't going to attempt to reproduce the VBScript's functionality, but it
looks like most of it wasn't even needed. The following does not use any
pre-XSLT-1.0-specific constructs, and will probably produce output very close
to what was expected. It seems to work in IE, but I can't test with MSXML2
(IE5.0), myself.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/TR/WD-xsl";>

  <xsl:template match="/">
    <html>
      <head>
        <style type="text/css">
     p.page {page-break-after: always}
     body {background-color:#cccccc; margin:0
           font:MessageBox;
           font:Message-Box;}
    .TableBody {background: white;
       font-family: arial;
       font-size: 9px}
    .TableHeading  {border-top-width:1;
       border-left-width:1;
       border-bottom-width:1;
       border-right-width:1;
       border-right-color:black;
       border-bottom-color:black;
       border-style:outset;
       font-family:verdana;
       font-size:10px;
       background-color:#cccccc}
        </style>
        <!-- rest of head here -->
      </head>
      <body>
        <xsl:apply-templates select="XMLData/Page" />
      </body>
    </html>
  </xsl:template>

  <xsl:template match="Page">
    <p class="page">
      <table style="background: black" cellspacing="1" width="600">
        <thead>
          <xsl:apply-templates select="Columns/Column" mode="thead" />
        </thead>
        <tbody class="TableBody">
          <xsl:apply-templates select="People/Person" />
        </tbody>
      </table>
    </p>
  </xsl:template>

  <xsl:template match="Caption">
    <xsl:value-of select="." />
  </xsl:template>

  <xsl:template match="Column" mode="thead">
    <th nowrap="yes" class="TableHeading">
      <xsl:apply-templates select="Caption" />
    </th>
  </xsl:template>

  <xsl:template match="Person">
    <tr>
      <xsl:apply-templates select="Data/*" />
    </tr>
  </xsl:template>

  <xsl:template match="A1|A2|A3|A4|A5|A6">
    <td valign="top">
      <xsl:attribute name="style">color:#<xsl:choose>
          <xsl:when test="@color">
              <xsl:value-of select="@color" />
          </xsl:when>
          <xsl:otherwise>000000</xsl:otherwise>
        </xsl:choose>;background-color:#<xsl:choose>
          <xsl:when test="@fond">
              <xsl:value-of select="@fond" />
          </xsl:when>
          <xsl:otherwise>FFFFFF</xsl:otherwise>
        </xsl:choose>;</xsl:attribute>
      <xsl:value-of select="." />
    </td>
  </xsl:template>

</xsl:stylesheet>

If you change the namespace, it should work as XSLT 1.0.

Note that I did circumvent the logic for finding which 'A' element to process
(A1, A2, A3, etc.) by looking at the Column specifications. The example data
had them all in order. If they will not really be in order, and since MSXML2
does not permit the XPath functions that would be needed to sort them, you'll
have to ask in an MSXML specific forum.

Anyway, I hope this helps at least with sorting out the colors and number
of columns, and helps reduce the stylesheet to a more manageable size.
There was a lot of unnecessary stuff in it. In general, any time you do

<xsl:template match="foo">
  <xsl:for-each select="bar">
    ...
  </>
</>

you probably could have changed the xsl:apply-templates to select
"foo/bar", and then made a template that matches bar instead of foo.

   - Mike
____________________________________________________________________________
  mike j. brown                   |  xml/xslt: http://skew.org/xml/
  denver/boulder, colorado, usa   |  resume: http://skew.org/~mike/resume/

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>