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]=>XslDecimalFormat
\r
42 Hashtable decimalFormats = new Hashtable ();
\r
43 // [QName]=>XmlSpace
\r
44 Hashtable parameters = new Hashtable ();
\r
46 MSXslScriptManager msScripts = new MSXslScriptManager ();
\r
47 XslTemplateTable templates;
\r
49 // stylesheet attributes
\r
51 XmlQualifiedName [] extensionElementPrefixes;
\r
52 XmlQualifiedName [] excludeResultPrefixes;
\r
54 // below are newly introduced in XSLT 2.0
\r
56 // xsl:import-schema should be interpreted into it.
\r
57 XmlSchemaCollection schemas = new XmlSchemaCollection ();
\r
58 // [QName]=>XslCharacterMap
\r
59 Hashtable characterMap = new Hashtable ();
\r
60 // [QName]=>XslDateFormat
\r
61 Hashtable dateFormats = new Hashtable ();
\r
62 // [QName]=>XslFunction
\r
63 Hashtable functions = new Hashtable ();
\r
64 // [QName]=>XslSortKey
\r
65 Hashtable sortKeys = new Hashtable ();
\r
67 string xpathDefaultNamespace = "";
\r
68 XslDefaultValidation defaultValidation = XslDefaultValidation.Lax;
\r
70 public ArrayList Imports {
\r
71 get { return imports; }
\r
74 public Hashtable SpaceControls {
\r
75 get { return spaceControls; }
\r
78 public Hashtable NamespaceAliases {
\r
79 get { return namespaceAliases; }
\r
82 public Hashtable DecimalFormats {
\r
83 get { return decimalFormats; }
\r
86 public Hashtable Parameters {
\r
87 get { return parameters; }
\r
90 public MSXslScriptManager ScriptManager{
\r
91 get { return msScripts; }
\r
94 public XslTemplateTable Templates {
\r
95 get { return templates; }
\r
99 public XslStylesheet (Compiler c)
\r
102 c.PushStylesheet (this);
104 templates = new XslTemplateTable (this);
\r
105 if (c.Input.NamespaceURI != XsltNamespace) {
\r
106 // then it is simplified stylesheet.
\r
107 Templates.Add (new XslTemplate (c));
\r
109 version = c.Input.GetAttribute ("version", "");
\r
110 extensionElementPrefixes = c.ParseQNameListAttribute ("extension-element-prefixes");
\r
111 excludeResultPrefixes = c.ParseQNameListAttribute ("exclude-result-prefixes");
\r
113 ProcessTopLevelElements ();
\r
116 c.PopStylesheet ();
\r
119 private XslStylesheet (Compiler c, XslStylesheet importer) : this (c)
121 this.importer = importer;
124 private void HandleInclude (string href)
126 c.PushInputDocument (href);
127 ProcessTopLevelElements ();
128 c.PopInputDocument ();
131 private void HandleImport (string href)
133 c.PushInputDocument (href);
134 imports.Add (new XslStylesheet (c, this));
135 c.PopInputDocument ();
138 private void HandleTopLevelElement ()
140 XPathNavigator n = c.Input;
141 switch (n.NamespaceURI)
148 HandleInclude (c.GetAttribute ("href"));
151 HandleImport (c.GetAttribute ("href"));
153 case "preserve-space":
154 AddSpaceControls (c.ParseQNameListAttribute ("elements"), XmlSpace.Preserve, n);
158 AddSpaceControls (c.ParseQNameListAttribute ("elements"), XmlSpace.Default, n);
161 case "namespace-alias":
162 namespaceAliases.Add (c.GetAttribute ("stylesheet-prefix", ""), c.GetAttribute ("result-prefix", ""));
165 case "attribute-set":
166 c.AddAttributeSet (new XslAttributeSet (c));
170 c.AddKeyPattern (new XslKey (c));
178 templates.Add (new XslTemplate (c));
181 c.AddGlobalVariable (new XslGlobalVariable (c));
184 c.AddGlobalVariable (new XslGlobalParam (c));
188 case MSXsltNamespace:
192 msScripts.AddScript (n);
199 private void ProcessTopLevelElements ()
\r
201 if (c.Input.MoveToFirstChild ()) {
\r
203 if (c.Input.NodeType == XPathNodeType.Element) {
204 Debug.EnterNavigator (c);
205 this.HandleTopLevelElement();
206 Debug.ExitNavigator (c);
208 } while (c.Input.MoveToNext ());
210 c.Input.MoveToParent ();
214 private void AddSpaceControls (QName [] names, XmlSpace result, XPathNavigator styleElem)
\r
216 foreach (QName name in names)
\r
217 spaceControls.Add (name, result);
\r
223 public enum XslDefaultValidation
\r