[xsl] Need advise on filtering XSL

Subject: [xsl] Need advise on filtering XSL
From: "Stanger, Jan" <jan.stanger@xxxxxxxx>
Date: Tue, 28 Jan 2003 15:38:42 +0100
Hello all! This is my first post and unfortunately quite a big one as well. I am looking at the following XSL that has been written by someone else and am trying to understand certain parts of it. First and foremost, as you can see in the comments the output method has been set to text so that &lt; and &gt; would be treated properly. Elsewhere I have read that this is not a recommended way of creating an output XML. Also, both for-each loops in the center are taking very long for huge XML input documents. Is there anything that can be made more efficient? Since the output XML will be identical in structure to the input one, I thought it would be possible to use <xsl:copy-of select="."/> in the two template match functions at the bottom, but it did not work correctly.

It's probably not a good style to post complete source code examples, but there are many aspects in below script that just seem to tie into one another so I chose to post the entire code.

To explain a bit more, both, the input and output XML will look somewhat like this and describe a two-dimensional data structure (e.g. db table contents):

<DataSet>
  <ResultSetMetaData>
    <ColumnMetaData dtype="number" name="Quantity">
    <ColumnMetaData dtype="text" name="Description">
  </ResultSetMetaData>

  <DataRow type="detail">
    <column name="Quantity">255.00</column>
    <column name="Description">IBM</column>
  </DataRow>

  <DataRow type="detail">
    <column name="Quantity">100.00</column>
    <column name="Description">Sun Microsystems</column>
  </DataRow>
</DataSet>

The output XML will have an identical structure, and will either also have identical content (in the case where $filterstmt = 'ALL') or have some rows filtered out.

-------------Begin of XSL code example-------------

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0" xmlns:xalan="http://xml.apache.org/xalan"; exclude-result-prefixes="xalan">
<xsl:strip-space elements="DataSet ResultSet ResultSetMetaData DataRow column"/>

<!-- The output method is selected as "text" so that &lt; and &gt; can be correctly represented in resulting XML as less than and greater than signs -->
<xsl:output method="text"/>

<!-- parameter used to hold the filter statement -->
<xsl:param name="filterstmt"/>

<xsl:template match="DataSet">
  &lt;DataSet&gt;

  <!--This loop is used to copy all the metadata info to the resulting XML-->
  <xsl:for-each select="ResultSetMetaData">
    &lt;ResultSetMetaData&gt;
      <xsl:apply-templates select="ColumnMetaData"/>
    &lt;/ResultSetMetaData&gt;
  </xsl:for-each>

  <!-- If no filter criteria is provided by the user(Example the first time report is shown) a default filter "ALL" is passed to XSL. This is required to select a specific xsl:for-each to be used. If filter is "ALL" then all DataRow are looped where as if a filter is given then it is restricted based on the filter provided. Two different loops are used since if we use the same for loop, for both the cases then output when no filter is provided does not have correct output records. -->
    <xsl:choose>

      <!--This loop is used to copy all the filtered data to the resulting XML-->
      <xsl:when test="'ALL'=$filterstmt">
        <xsl:for-each select="DataRow">
          &lt;DataRow type="detail"&gt;
            <xsl:apply-templates select="column"/>
          &lt;/DataRow&gt;
        </xsl:for-each>
      </xsl:when>

      <xsl:otherwise>
      <!--This loop is used to copy all the filtered data to the resulting XML-->
        <xsl:for-each select="DataRow[xalan:evaluate($filterstmt)]">
          &lt;DataRow type="detail"&gt;
            <xsl:apply-templates select="column"/>
          &lt;/DataRow&gt;
        </xsl:for-each>
      </xsl:otherwise>

    </xsl:choose>

  &lt;/DataSet&gt;
</xsl:template>

<!-- This template is used to copy the contents of element ColumnMetaData-->
<xsl:template match="ColumnMetaData">
  &lt;ColumnMetaData name='<xsl:value-of select="@name"/>' dtype='<xsl:value-of select="@dtype"/>' /&gt;
</xsl:template>

<!-- This template is used to copy the contents of element column -->
<xsl:template match="column">
  &lt;column name='<xsl:value-of select="@name"/>'&gt;<xsl:apply-templates/>&lt;/column&gt;
</xsl:template>

</xsl:stylesheet>

This message is for the named person's use only. It may contain sensitive and private proprietary or legally privileged information. No confidentiality or privilege is waived or lost by any mistransmission. If you are not the intended recipient, please immediately delete it and all copies of it from your system, destroy any hard copies of it and notify the sender. You must not, directly or indirectly, use, disclose, distribute, print, or copy any part of this message if you are not the intended recipient. CREDIT SUISSE GROUP and each legal entity in the CREDIT SUISSE FIRST BOSTON or CREDIT SUISSE ASSET MANAGEMENT business units of CREDIT SUISSE FIRST BOSTON reserve the right to monitor all e-mail communications through its networks. Any views expressed in this message are those of the individual sender, except where the message states otherwise and the sender is authorized to state them to be the views of any such entity.
Unless otherwise stated, any pricing information given in this message is indicative only, is subject to change and does not constitute an offer to deal at any price quoted. Any reference to the terms of executed transactions should be treated as  preliminary only and subject to our formal written confirmation.



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


Current Thread