I have an application that applies XSL Stylesheets to XML data to produce
HTML. The stylesheets are external files that exist in a directory and are
read in by the application. Each stylesheet is applied to the same XML, they
just provide different "views" of the same data (i.e., Summary info, detail
info, specific info, etc.). Since the files are stored externally the idea
is that they don't have any correlating information in the database, but
there is the desire to have certain metadata information for each
stylesheet, such as author, name, description, etc.

The idea was to add a new namespace to the xslt document and use it to store
the metadata. This could then be read as the stylesheets were read by the
application.

Example:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:cdx="http://mycompany/stylesheets";>
<xsl:output method="html"></xsl:output>
<cdx:sheet name="Summary Info" description="Summary Info of order."
systemid="14653A6E-0A63-46D5-B2FE-EDD0BAE22A0C"
author="M. Wood"></cdx:sheet>
<xsl:template match="/">
<HTML>
  ...rest of stylesheet template....
</HTML>
</xsl:template>
</xsl:stylesheet>

Now, the plan was on application startup to look in this directory and
iterate the stylesheet files. Open each one and read them into a hashtable.
The meta data would be loaded as well and used to provide a dropdown later
in the application for a list of possible stylesheets to apply to the data.
We wanted to be able to validate the stylesheets to ensure they had the cdx
namespace and that it fit a schema (to ensure all the required fields were
filled out for the metadata; see scheme at end of email). Here is where I
ran into my issue. I can't seem to find a way to validate this stylesheet.

My approaches so far:

1) Use an XMLValidatingReader object to load in the stylesheet. As far as I
knew this was the only .Net object used to validate XML against a schema.
So, I attempted this. I added the schema file to the schema collection, but
on the Read method it died since the xsl
(http://www.w3.org/1999/XSL/Transform) namespace did not validate. I
thought, okay, all I need to do is add this schema to the collection, but
wait....that would require a physical schema file for XSL. Hmmm....doesn't
sound like a good thing to me. But, wait, VS.Net ships with one of these!
So, pop the xslt.xsd file into the schema collection and then it doesn't
like the embedded HTML in the templates. *Sigh*

2) Before I was working on the validation of the stylesheets I was already
applying the stylesheets in a reference model by loading it up in the
XSLTransform object. This appeared to be validating the stylesheet against
the XSLT schema, but pretty much ignored the other namespace completely. I
could not find a way to get it to check the other namespace via it's schema.
The help specifically states, "if you have entities in your xsl that you
need to validate, use the XMLValidatingReader class". Hmmm, see above
frustration.   I'm using the 1.1 Framework where over half of the Load
methods in the XSLTRansform object have been obsolete.

So, what I really need to be able to validate the cdx namespace only in the
document and pretty much ignore the xsl namespace or the HTML in the
templates.



Schema for the cdx namespace:
______________________________________
<?xml version="1.0" ?>
<xs:schema id="CdxStylesheet" targetNamespace="http://mycompany/stylesheets";
 xmlns:mstns="http://mycompany/stylesheets";
xmlns="http://mycompany/stylesheets";
 xmlns:xs="http://www.w3.org/2001/XMLSchema";
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
 attributeFormDefault="qualified" elementFormDefault="qualified">
 <xs:element name="sheet">
  <xs:complexType>
   <xs:attribute name="name" form="unqualified" type="xs:string" />
   <xs:attribute name="description" form="unqualified" type="xs:string" />
   <xs:attribute name="systemid" form="unqualified" type="xs:string" />
   <xs:attribute name="author" form="unqualified" type="xs:string" />
  </xs:complexType>
 </xs:element>
</xs:schema>




===================================
This list is hosted by DevelopMentorŪ  http://www.develop.com
Some .NET courses you may be interested in:

NEW! Guerrilla ASP.NET, 17 May 2004, in Los Angeles
http://www.develop.com/courses/gaspdotnetls

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to