5 // Ben Maurer (bmaurer@users.sourceforge.net)
6 // Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)
9 // (C) 2003 Atsushi Enomoto
13 using System.CodeDom;
\r
14 using System.Collections;
15 using System.Collections.Specialized;
\r
17 using System.Xml.Schema;
\r
18 using System.Xml.XPath;
\r
22 using Mono.Xml.Xsl.Operations;
24 using QName = System.Xml.XmlQualifiedName;
\r
26 namespace Mono.Xml.Xsl {
\r
28 public class XslStylesheet {
\r
29 public const string XsltNamespace = "http://www.w3.org/1999/XSL/Transform";
\r
30 public const string MSXsltNamespace = "urn:schemas-microsoft-com:xslt::script";
\r
34 XslStylesheet importer;
\r
35 // Top-level elements
\r
36 ArrayList imports = new ArrayList ();
\r
37 // [QName]=>XmlSpace
\r
38 Hashtable spaceControls = new Hashtable ();
\r
39 // [string stylesheet-prefix]=>string result-prefix
\r
40 Hashtable namespaceAliases = new Hashtable ();
\r
41 // [QName]=>XmlSpace
\r
42 Hashtable parameters = new Hashtable ();
\r
44 MSXslScriptManager msScripts = new MSXslScriptManager ();
\r
45 XslTemplateTable templates;
\r
47 // stylesheet attributes
\r
49 XmlQualifiedName [] extensionElementPrefixes;
\r
50 XmlQualifiedName [] excludeResultPrefixes;
\r
52 // below are newly introduced in XSLT 2.0
\r
54 // xsl:import-schema should be interpreted into it.
\r
55 XmlSchemaCollection schemas = new XmlSchemaCollection ();
\r
56 // [QName]=>XslCharacterMap
\r
57 Hashtable characterMap = new Hashtable ();
\r
58 // [QName]=>XslDateFormat
\r
59 Hashtable dateFormats = new Hashtable ();
\r
60 // [QName]=>XslFunction
\r
61 Hashtable functions = new Hashtable ();
\r
62 // [QName]=>XslSortKey
\r
63 Hashtable sortKeys = new Hashtable ();
\r
65 string xpathDefaultNamespace = "";
\r
66 XslDefaultValidation defaultValidation = XslDefaultValidation.Lax;
\r
68 public ArrayList Imports {
\r
69 get { return imports; }
\r
72 public Hashtable SpaceControls {
\r
73 get { return spaceControls; }
\r
76 public Hashtable NamespaceAliases {
\r
77 get { return namespaceAliases; }
\r
80 public Hashtable Parameters {
\r
81 get { return parameters; }
\r
84 public MSXslScriptManager ScriptManager{
\r
85 get { return msScripts; }
\r
88 public XslTemplateTable Templates {
\r
89 get { return templates; }
\r
93 public XslStylesheet (Compiler c)
\r
96 c.PushStylesheet (this);
98 templates = new XslTemplateTable (this);
\r
99 if (c.Input.NamespaceURI != XsltNamespace) {
\r
100 // then it is simplified stylesheet.
\r
101 Templates.Add (new XslTemplate (c));
\r
103 version = c.Input.GetAttribute ("version", "");
\r
104 extensionElementPrefixes = c.ParseQNameListAttribute ("extension-element-prefixes");
\r
105 excludeResultPrefixes = c.ParseQNameListAttribute ("exclude-result-prefixes");
\r
107 ProcessTopLevelElements ();
\r
110 c.PopStylesheet ();
\r
113 private XslStylesheet (Compiler c, XslStylesheet importer) : this (c)
115 this.importer = importer;
118 private void HandleInclude (string href)
120 c.PushInputDocument (href);
121 ProcessTopLevelElements ();
122 c.PopInputDocument ();
125 private void HandleImport (string href)
127 c.PushInputDocument (href);
128 imports.Add (new XslStylesheet (c, this));
129 c.PopInputDocument ();
132 private void HandleTopLevelElement ()
134 XPathNavigator n = c.Input;
135 switch (n.NamespaceURI)
142 HandleInclude (c.GetAttribute ("href"));
145 HandleImport (c.GetAttribute ("href"));
147 case "preserve-space":
148 AddSpaceControls (c.ParseQNameListAttribute ("elements"), XmlSpace.Preserve, n);
152 AddSpaceControls (c.ParseQNameListAttribute ("elements"), XmlSpace.Default, n);
155 case "namespace-alias":
156 namespaceAliases.Add (c.GetAttribute ("stylesheet-prefix", ""), c.GetAttribute ("result-prefix", ""));
159 case "attribute-set":
160 c.AddAttributeSet (new XslAttributeSet (c));
164 c.AddKeyPattern (new XslKey (c));
171 case "decimal-format":
172 c.CompileDecimalFormat ();
176 templates.Add (new XslTemplate (c));
179 c.AddGlobalVariable (new XslGlobalVariable (c));
182 c.AddGlobalVariable (new XslGlobalParam (c));
186 case MSXsltNamespace:
190 msScripts.AddScript (n);
197 private void ProcessTopLevelElements ()
\r
199 if (c.Input.MoveToFirstChild ()) {
\r
201 if (c.Input.NodeType == XPathNodeType.Element) {
202 Debug.EnterNavigator (c);
203 this.HandleTopLevelElement();
204 Debug.ExitNavigator (c);
206 } while (c.Input.MoveToNext ());
208 c.Input.MoveToParent ();
212 private void AddSpaceControls (QName [] names, XmlSpace result, XPathNavigator styleElem)
\r
214 foreach (QName name in names)
\r
215 spaceControls.Add (name, result);
\r
221 public enum XslDefaultValidation
\r