2 // XslLiteralElement.cs
5 // Ben Maurer (bmaurer@users.sourceforge.net)
6 // Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)
9 // (C) 2003 Atsushi Enomoto
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System
.Collections
;
36 using System
.Xml
.XPath
;
39 namespace Mono
.Xml
.Xsl
.Operations
{
40 internal class XslLiteralElement
: XslCompiledElement
{
41 XslOperation children
;
42 string localname
, prefix
, nsUri
;
45 XmlQualifiedName
[] useAttributeSets
;
47 string excludeResultPrefixes
;
48 string extensionElementPrefixes
;
49 ArrayList excludedPrefixes
;
51 XPathNavigator stylesheetNode
;
52 XslStylesheet stylesheet
;
54 public XslLiteralElement (Compiler c
) : base (c
) {}
56 class XslLiteralAttribute
{
57 string localname
, prefix
, nsUri
;
60 public XslLiteralAttribute (Compiler c
)
62 this.prefix
= c
.Input
.Prefix
;
63 this.nsUri
= c
.Input
.NamespaceURI
;
64 this.localname
= c
.Input
.LocalName
;
65 this.val
= new XslAvt (c
.Input
.Value
, c
);
68 public void Evaluate (XslTransformProcessor p
)
70 p
.Out
.WriteAttributeString (prefix
, localname
, nsUri
, val
.Evaluate (p
));
74 protected override void Compile (Compiler c
)
76 requireNameFix
= true;
77 stylesheetNode
= c
.Input
.Clone ();
78 stylesheet
= c
.CurrentStylesheet
;
80 this.localname
= c
.Input
.LocalName
;
81 this.useAttributeSets
= c
.ParseQNameListAttribute ("use-attribute-sets", XsltNamespace
);
82 this.nsDecls
= c
.GetNamespacesToCopy ();
83 if (nsDecls
.Count
== 0) nsDecls
= null;
84 this.isEmptyElement
= c
.Input
.IsEmptyElement
;
85 this.excludeResultPrefixes
= c
.Input
.GetAttribute ("exclude-result-prefixes", XsltNamespace
);
86 this.extensionElementPrefixes
= c
.Input
.GetAttribute ("extension-element-prefixes", XsltNamespace
);
87 excludedPrefixes
= new ArrayList (excludeResultPrefixes
.Split (XmlChar
.WhitespaceChars
));
88 excludedPrefixes
.AddRange (extensionElementPrefixes
.Split (XmlChar
.WhitespaceChars
));
90 if (c
.Input
.MoveToFirstAttribute ())
92 attrs
= new ArrayList ();
94 if (c
.Input
.NamespaceURI
== XsltNamespace
)
95 continue; //already handled
96 attrs
.Add (new XslLiteralAttribute (c
));
97 } while (c
.Input
.MoveToNextAttribute());
98 c
.Input
.MoveToParent ();
101 if (!c
.Input
.MoveToFirstChild ()) return;
102 children
= c
.CompileTemplateContent ();
103 c
.Input
.MoveToParent ();
106 private void GetCorrectNames ()
108 requireNameFix
= false;
109 prefix
= stylesheetNode
.Prefix
;
110 string alias = stylesheet
.PrefixInEffect (prefix
, null);
111 if (alias != null && alias != stylesheetNode
.Prefix
) {
112 nsUri
= stylesheetNode
.GetNamespace (alias);
117 nsUri
= stylesheetNode
.NamespaceURI
;
121 public override void Evaluate (XslTransformProcessor p
)
123 // Since namespace-alias might be determined after compilation
124 // of import-ing stylesheets, this must be determined later.
128 bool isCData
= p
.InsideCDataElement
;
129 p
.PushElementState (localname
, nsUri
, true);
130 p
.Out
.WriteStartElement (prefix
, localname
, nsUri
);
132 if (useAttributeSets
!= null)
133 foreach (XmlQualifiedName s
in useAttributeSets
)
134 p
.ResolveAttributeSet (s
).Evaluate (p
);
137 int len
= attrs
.Count
;
138 for (int i
= 0; i
< len
; i
++)
139 ((XslLiteralAttribute
)attrs
[i
]).Evaluate (p
);
142 p
.TryStylesheetNamespaceOutput (excludedPrefixes
);
143 if (nsDecls
!= null) {
144 foreach (DictionaryEntry de
in nsDecls
) {
145 string actualPrefix
= p
.CompiledStyle
.Style
.PrefixInEffect (de
.Key
as String
, excludedPrefixes
);
146 if (actualPrefix
!= null)
147 p
.Out
.WriteNamespaceDecl (actualPrefix
, (string)de
.Value
);
151 if (children
!= null) children
.Evaluate (p
);
154 p
.Out
.WriteEndElement ();
156 p
.Out
.WriteFullEndElement ();
158 p
.PopCDataState (isCData
);