2 // Commons.Xml.Relaxng.RelaxngPattern.cs
\r
5 // Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
\r
7 // 2003 Atsushi Enomoto "No rights reserved."
\r
11 using System.Collections;
\r
14 using Commons.Xml.Relaxng.Derivative;
\r
16 namespace Commons.Xml.Relaxng
\r
18 #region Common abstract
\r
19 public abstract class RelaxngElementBase
\r
22 int lineNumber, linePosition;
\r
25 internal bool IsCompiled {
\r
26 get { return isCompiled; }
\r
27 set { isCompiled = value; }
\r
30 public int LineNumber {
\r
31 get { return lineNumber; }
\r
32 set { lineNumber = value; }
\r
35 public int LinePosition {
\r
36 get { return linePosition; }
\r
37 set { linePosition = value; }
\r
40 public string BaseUri {
\r
41 get { return baseUri; }
\r
42 set { baseUri = value; }
\r
45 public abstract void Write (XmlWriter write);
\r
48 public abstract class RelaxngSingleContentPattern : RelaxngPattern
\r
50 private RelaxngPatternList patterns = new RelaxngPatternList ();
\r
52 public RelaxngPatternList Patterns {
\r
53 get { return patterns; }
\r
56 internal RdpPattern makeSingle (RelaxngGrammar g)
\r
58 // Flatten patterns into RdpGroup. See 4.12.
\r
59 if (patterns.Count == 0)
\r
60 throw new RelaxngException ("No pattern contents.");
\r
61 RdpPattern p = ((RelaxngPattern) patterns [0]).Compile (g);
\r
62 if (patterns.Count == 1)
\r
64 for (int i=1; i<patterns.Count; i++) {
\r
65 p = new RdpGroup (p,
\r
66 ((RelaxngPattern) patterns [i]).Compile (g));
\r
71 internal override void CheckConstraints ()
\r
73 foreach (RelaxngPattern p in Patterns)
\r
74 p.CheckConstraints ();
\r
78 public abstract class RelaxngBinaryContentPattern : RelaxngPattern
\r
80 private RelaxngPatternList patterns = new RelaxngPatternList ();
\r
82 public RelaxngPatternList Patterns {
\r
83 get { return patterns; }
\r
86 internal RdpPattern makeBinary (RelaxngGrammar g)
\r
88 // Flatten patterns. See 4.12.
\r
89 if (patterns.Count == 0)
\r
90 throw new RelaxngException ("No pattern contents.");
\r
92 RdpPattern p = ((RelaxngPattern) patterns [0]).Compile (g);
\r
93 if (patterns.Count == 1)
\r
96 for (int i=1; i<patterns.Count; i++) {
\r
98 ((RelaxngPattern) patterns [i]).Compile (g);
\r
99 switch (this.PatternType) {
\r
100 case RelaxngPatternType.Choice:
\r
101 p = new RdpChoice (p, cp);
\r
103 case RelaxngPatternType.Group:
\r
104 p = new RdpGroup (p, cp);
\r
106 case RelaxngPatternType.Interleave:
\r
107 p = new RdpInterleave (p, cp);
\r
115 internal override void CheckConstraints ()
\r
117 foreach (RelaxngPattern p in Patterns)
\r
118 p.CheckConstraints ();
\r
123 #region Grammatical elements
\r
124 public class RelaxngStart : RelaxngElementBase
\r
129 public RelaxngStart ()
\r
133 public string Combine {
\r
134 get { return combine; }
\r
135 set { combine = value; }
\r
138 public RelaxngPattern Pattern {
\r
143 public override void Write (XmlWriter writer)
\r
145 writer.WriteStartElement ("", "start", RelaxngGrammar.NamespaceURI);
\r
146 if (combine != null)
\r
147 writer.WriteAttributeString ("combine", combine);
\r
149 writer.WriteEndElement ();
\r
152 internal RdpPattern Compile (RelaxngGrammar grammar)
\r
154 return p.Compile (grammar);
\r
158 public class RelaxngDefine : RelaxngElementBase
\r
161 private RelaxngPatternList patterns = new RelaxngPatternList ();
\r
164 public RelaxngDefine ()
\r
168 public RelaxngPatternList Patterns {
\r
169 get { return patterns; }
\r
172 public string Combine {
\r
173 get { return combine; }
\r
174 set { combine = value; }
\r
177 public string Name {
\r
178 get { return name; }
\r
179 set { name = value; }
\r
182 public override void Write (XmlWriter writer)
\r
184 writer.WriteStartElement ("", "define", RelaxngGrammar.NamespaceURI);
\r
185 writer.WriteAttributeString ("name", name);
\r
186 if (combine != null)
\r
187 writer.WriteAttributeString ("combine", combine);
\r
188 foreach (RelaxngPattern p in Patterns)
\r
190 writer.WriteEndElement ();
\r
193 internal RdpPattern Compile (RelaxngGrammar grammar)
\r
195 return makeSingle (grammar);
\r
198 private RdpPattern makeSingle (RelaxngGrammar g)
\r
200 // Flatten patterns into RdpGroup. See 4.12.
\r
201 if (patterns.Count == 0)
\r
202 throw new RelaxngException ("No pattern contents.");
\r
203 RdpPattern p = ((RelaxngPattern) patterns [0]).Compile (g);
\r
204 if (patterns.Count == 1)
\r
206 for (int i=1; i<patterns.Count; i++) {
\r
207 p = new RdpGroup (p,
\r
208 ((RelaxngPattern) patterns [i]).Compile (g));
\r
214 public class RelaxngInclude : RelaxngElementBase
\r
217 IList starts = new ArrayList ();
\r
218 IList defines = new ArrayList ();
\r
219 IList divs = new ArrayList ();
\r
222 public RelaxngInclude ()
\r
226 public string Href {
\r
227 get { return href; }
\r
228 set { href = value; }
\r
231 public IList Starts {
\r
232 get { return starts; }
\r
235 public IList Defines {
\r
236 get { return defines; }
\r
239 public IList Divs {
\r
240 get { return divs; }
\r
243 public string NSContext {
\r
245 set { ns = value; }
\r
248 public override void Write (XmlWriter writer)
\r
250 writer.WriteStartElement ("", "include", RelaxngGrammar.NamespaceURI);
\r
251 writer.WriteAttributeString ("href", href);
\r
252 foreach (RelaxngStart start in Starts)
\r
253 start.Write (writer);
\r
254 foreach (RelaxngDefine define in Defines)
\r
255 define.Write (writer);
\r
256 foreach (RelaxngDiv div in Divs)
\r
257 div.Write (writer);
\r
258 writer.WriteEndElement ();
\r
261 // compile into div
\r
262 internal RelaxngDiv Compile (RelaxngGrammar grammar)
\r
264 grammar.CheckIncludeRecursion (Href);
\r
265 grammar.IncludedUris.Add (Href, Href);
\r
266 string url = Util.ResolveUri (BaseUri, href);
\r
267 XmlTextReader xtr = new XmlTextReader (url);
\r
268 RelaxngGrammar g = null;
\r
270 RelaxngReader r = new RelaxngReader (xtr, ns);
\r
271 r.MoveToContent ();
\r
272 g = r.ReadPattern () as RelaxngGrammar;
\r
277 throw new RelaxngException ("Included syntax must start with \"grammar\" element.");
\r
278 g.DataProvider = grammar.Provider;
\r
280 // process recursive inclusions.
\r
281 foreach (RelaxngInclude inc in g.Includes)
\r
282 g.Divs.Add (inc.Compile (grammar));
\r
284 // process this own div children.
\r
285 // each div subelements are also compiled.
\r
286 foreach (RelaxngDiv cdiv in divs)
\r
288 foreach (RelaxngDiv cdiv in g.Divs)
\r
291 // replace redifinitions into div.
\r
293 if (this.Starts.Count > 0 && g.Starts.Count == 0)
\r
294 throw new RelaxngException ("When the included grammar does not contain start components, this include component must not contain start components.");
\r
295 IList appliedStarts = (this.starts.Count > 0) ?
\r
296 this.starts : g.Starts;
\r
298 RelaxngDiv div = new RelaxngDiv ();
\r
299 div.BaseUri = this.BaseUri;
\r
300 div.LinePosition = this.LinePosition;
\r
301 div.LineNumber = this.LineNumber;
\r
303 foreach (RelaxngStart start in appliedStarts)
\r
304 div.Starts.Add (start);
\r
307 Hashtable overrides = new Hashtable ();
\r
308 Hashtable originalDefs = new Hashtable ();
\r
309 foreach (RelaxngDefine def in defines) {
\r
310 overrides.Add (def.Name, def.Name);
\r
311 div.Defines.Add (def);
\r
313 foreach (RelaxngDefine def in g.Defines) {
\r
314 originalDefs.Add (def.Name, def.Name);
\r
315 if (overrides [def.Name] == null)
\r
316 div.Defines.Add (def);
\r
319 foreach (string name in overrides.Values)
\r
320 if (!originalDefs.Contains (name))
\r
321 throw new RelaxngException ("The include component must not contain define components whose name does not appear in the included grammar component.");
\r
323 grammar.IncludedUris.Remove (Href);
\r
328 public class RelaxngDiv : RelaxngElementBase
\r
330 IList starts = new ArrayList ();
\r
331 IList defines = new ArrayList ();
\r
332 IList includes = new ArrayList ();
\r
333 IList divs = new ArrayList ();
\r
335 public RelaxngDiv ()
\r
339 public IList Starts {
\r
340 get { return starts; }
\r
343 public IList Defines {
\r
344 get { return defines; }
\r
347 public IList Includes {
\r
348 get { return includes; }
\r
351 public IList Divs {
\r
352 get { return divs; }
\r
355 public override void Write (XmlWriter writer)
\r
357 writer.WriteStartElement ("", "div", RelaxngGrammar.NamespaceURI);
\r
358 foreach (RelaxngStart start in Starts)
\r
359 start.Write (writer);
\r
360 foreach (RelaxngDefine define in Defines)
\r
361 define.Write (writer);
\r
362 foreach (RelaxngInclude include in Includes)
\r
363 include.Write (writer);
\r
364 foreach (RelaxngDiv div in Divs)
\r
365 div.Write (writer);
\r
366 writer.WriteEndElement ();
\r
369 internal void Compile (RelaxngGrammar grammar)
\r
371 foreach (RelaxngDiv div in divs)
\r
372 div.Compile (grammar);
\r
373 foreach (RelaxngInclude inc in includes)
\r
374 inc.Compile (grammar).Compile (grammar); // compile compiled divs
\r
375 foreach (RelaxngStart start in starts)
\r
376 grammar.Starts.Add (start);
\r
377 foreach (RelaxngDefine define in defines)
\r
378 grammar.Defines.Add (define);
\r
383 #region RelaxngPatterns
\r
384 public abstract class RelaxngPattern : RelaxngElementBase
\r
388 public static RelaxngPattern Read (XmlReader xmlReader)
\r
390 return Read (xmlReader, null);
\r
393 public static RelaxngPattern Read (XmlReader xmlReader, RelaxngDatatypeProvider provider)
\r
395 RelaxngReader r = new RelaxngReader (xmlReader, null);
\r
396 if (r.ReadState == ReadState.Initial)
\r
398 r.MoveToContent ();
\r
399 RelaxngPattern p = r.ReadPattern ();
\r
400 p.DataProvider = provider;
\r
405 RdpPattern startRelaxngPattern;
\r
406 RelaxngDatatypeProvider provider;
\r
409 public abstract RelaxngPatternType PatternType { get; }
\r
410 public RelaxngDatatypeProvider DataProvider {
\r
419 public void Compile ()
\r
421 RelaxngGrammar g = null;
\r
422 if (this is RelaxngGrammar)
\r
423 g = (RelaxngGrammar) this;
\r
425 g = new RelaxngGrammar ();
\r
426 g.BaseUri = this.BaseUri;
\r
427 g.LineNumber = this.LineNumber;
\r
428 g.LinePosition = this.LinePosition;
\r
429 RelaxngStart st = new RelaxngStart ();
\r
430 st.BaseUri = this.BaseUri;
\r
431 st.LineNumber = this.LineNumber;
\r
432 st.LinePosition = this.LinePosition;
\r
435 g.Provider = provider;
\r
437 startRelaxngPattern = g.Compile (null);
\r
438 this.IsCompiled = true;
\r
443 internal abstract void CheckConstraints ();
\r
445 protected RelaxngPattern ()
\r
449 internal abstract RdpPattern Compile (RelaxngGrammar grammar);
\r
451 internal RdpPattern StartPattern {
\r
452 get { return startRelaxngPattern; }
\r
456 public class RelaxngPatternList : CollectionBase
\r
458 public RelaxngPatternList ()
\r
462 public void Add (RelaxngPattern p)
\r
467 public RelaxngPattern this [int i] {
\r
468 get { return this.List [i] as RelaxngPattern; }
\r
469 set { this.List [i] = value; }
\r
472 public void Insert (int pos, RelaxngPattern p)
\r
474 List.Insert (pos, p);
\r
477 public void Remove (RelaxngPattern p)
\r
483 // strict to say, it's not a pattern ;)
\r
484 public class RelaxngNotAllowed : RelaxngPattern
\r
486 public RelaxngNotAllowed ()
\r
490 public override RelaxngPatternType PatternType {
\r
491 get { return RelaxngPatternType.NotAllowed; }
\r
494 public override void Write (XmlWriter writer)
\r
496 writer.WriteStartElement ("", "notAllowed", RelaxngGrammar.NamespaceURI);
\r
497 writer.WriteEndElement ();
\r
500 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
502 return RdpNotAllowed.Instance;
\r
505 internal override void CheckConstraints ()
\r
507 // nothing to check
\r
511 public class RelaxngEmpty : RelaxngPattern
\r
513 public RelaxngEmpty ()
\r
517 public override RelaxngPatternType PatternType {
\r
518 get { return RelaxngPatternType.Empty; }
\r
521 public override void Write (XmlWriter writer)
\r
523 writer.WriteStartElement ("", "empty", RelaxngGrammar.NamespaceURI);
\r
524 writer.WriteEndElement ();
\r
527 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
529 return RdpEmpty.Instance;
\r
532 internal override void CheckConstraints ()
\r
534 // nothing to check
\r
538 public class RelaxngText : RelaxngPattern
\r
540 public RelaxngText ()
\r
544 public override RelaxngPatternType PatternType {
\r
545 get { return RelaxngPatternType.Text; }
\r
548 public override void Write (XmlWriter writer)
\r
550 writer.WriteStartElement ("", "text", RelaxngGrammar.NamespaceURI);
\r
551 writer.WriteEndElement ();
\r
554 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
556 return RdpText.Instance;
\r
559 internal override void CheckConstraints ()
\r
561 // nothing to check
\r
565 public abstract class RelaxngDataSupport : RelaxngPattern
\r
568 string datatypeLibrary;
\r
570 public string Type {
\r
571 get { return type; }
\r
572 set { type = value; }
\r
575 public string DatatypeLibrary {
\r
576 get { return datatypeLibrary; }
\r
577 set { datatypeLibrary = value; }
\r
580 internal void CheckDatatypeName ()
\r
582 // Data type name check is done in RdpData(Except) derivative creation.
\r
586 public class RelaxngData : RelaxngDataSupport
\r
588 RelaxngParamList paramList = new RelaxngParamList ();
\r
589 RelaxngExcept except;
\r
591 public RelaxngData ()
\r
595 public override RelaxngPatternType PatternType {
\r
596 get { return RelaxngPatternType.Data; }
\r
599 public RelaxngParamList ParamList {
\r
600 get { return paramList; }
\r
603 public RelaxngExcept Except {
\r
604 get { return except; }
\r
605 set { except = value; }
\r
608 public override void Write (XmlWriter writer)
\r
610 writer.WriteStartElement ("", "data", RelaxngGrammar.NamespaceURI);
\r
611 if (DatatypeLibrary != null && DatatypeLibrary != String.Empty)
\r
612 writer.WriteAttributeString ("xmlns", "data", "http://www.w3.org/2000/xmlns/", DatatypeLibrary);
\r
613 writer.WriteStartAttribute ("type", String.Empty);
\r
614 writer.WriteQualifiedName (Type, DatatypeLibrary);
\r
615 writer.WriteEndAttribute ();
\r
617 foreach (RelaxngParam p in ParamList)
\r
620 if (Except != null)
\r
621 Except.Write (writer);
\r
623 writer.WriteEndElement ();
\r
626 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
628 // RdpParamList rdpl = new RdpParamList ();
\r
629 // foreach (RelaxngParam prm in this.paramList)
\r
630 // rdpl.Add (prm.Compile (grammar));
\r
631 RdpPattern p = null;
\r
632 if (this.except != null) {
\r
633 if (except.Patterns.Count == 0)
\r
634 throw new RelaxngException ("data except pattern have no children.");
\r
635 p = except.Patterns [0].Compile (grammar);
\r
636 for (int i=1; i<except.Patterns.Count; i++)
\r
637 p = new RdpChoice (p,
\r
638 except.Patterns [i].Compile (grammar));
\r
642 if (this.except != null)
\r
643 return new RdpDataExcept (new RdpDatatype (DatatypeLibrary, Type, ParamList, grammar.Provider), p);
\r
645 return new RdpData (new RdpDatatype (DatatypeLibrary, Type, ParamList, grammar.Provider));
\r
648 internal override void CheckConstraints ()
\r
650 CheckDatatypeName ();
\r
654 public class RelaxngValue : RelaxngDataSupport
\r
658 public override RelaxngPatternType PatternType {
\r
659 get { return RelaxngPatternType.Value; }
\r
662 public string Value {
\r
663 get { return value; }
\r
664 set { this.value = value; }
\r
667 public override void Write (XmlWriter writer)
\r
669 writer.WriteStartElement ("", "value", RelaxngGrammar.NamespaceURI);
\r
670 if (Type != null) {
\r
671 writer.WriteStartAttribute ("type", String.Empty);
\r
672 if (DatatypeLibrary != null && DatatypeLibrary != String.Empty)
\r
673 writer.WriteAttributeString ("xmlns", "data", "http://www.w3.org/2000/xmlns/", DatatypeLibrary);
\r
674 writer.WriteQualifiedName (Type, DatatypeLibrary);
\r
675 writer.WriteEndAttribute ();
\r
677 writer.WriteString (Value);
\r
678 writer.WriteEndElement ();
\r
681 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
684 return new RdpValue (new RdpDatatype (DatatypeLibrary,
\r
685 Type, null, grammar.Provider), value);
\r
688 internal override void CheckConstraints ()
\r
690 CheckDatatypeName ();
\r
694 public class RelaxngList : RelaxngSingleContentPattern
\r
696 internal RelaxngList ()
\r
700 public override RelaxngPatternType PatternType {
\r
701 get { return RelaxngPatternType.List; }
\r
704 public override void Write (XmlWriter writer)
\r
706 writer.WriteStartElement ("", "list", RelaxngGrammar.NamespaceURI);
\r
707 foreach (RelaxngPattern p in Patterns)
\r
709 writer.WriteEndElement ();
\r
712 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
716 return new RdpList (makeSingle (grammar));
\r
719 internal override void CheckConstraints ()
\r
721 // nothing to check
\r
725 public class RelaxngElement : RelaxngSingleContentPattern
\r
727 RelaxngNameClass nc;
\r
729 public RelaxngElement ()
\r
733 public RelaxngNameClass NameClass {
\r
735 set { nc = value; }
\r
738 public override RelaxngPatternType PatternType {
\r
739 get { return RelaxngPatternType.Element; }
\r
742 public override void Write (XmlWriter writer)
\r
744 writer.WriteStartElement ("", "element", RelaxngGrammar.NamespaceURI);
\r
746 foreach (RelaxngPattern p in Patterns)
\r
748 writer.WriteEndElement ();
\r
751 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
753 return new RdpElement (
\r
754 nc.Compile (grammar), this.makeSingle (grammar));
\r
757 internal override void CheckConstraints ()
\r
759 NameClass.CheckConstraints (false, false);
\r
761 foreach (RelaxngPattern p in Patterns)
\r
762 p.CheckConstraints ();
\r
766 public class RelaxngAttribute : RelaxngPattern
\r
768 RelaxngNameClass nc;
\r
771 public RelaxngAttribute ()
\r
775 public RelaxngPattern Pattern {
\r
780 public RelaxngNameClass NameClass {
\r
782 set { nc = value; }
\r
785 public override RelaxngPatternType PatternType {
\r
786 get { return RelaxngPatternType.Attribute; }
\r
789 public override void Write (XmlWriter writer)
\r
791 writer.WriteStartElement ("", "attribute", RelaxngGrammar.NamespaceURI);
\r
795 writer.WriteEndElement ();
\r
798 private void checkInvalidAttrNameClass (RdpNameClass nc)
\r
800 string xmlnsNS = "http://www.w3.org/2000/xmlns";
\r
801 RdpNameClassChoice choice = nc as RdpNameClassChoice;
\r
802 if (choice != null) {
\r
803 checkInvalidAttrNameClass (choice.LValue);
\r
804 checkInvalidAttrNameClass (choice.RValue);
\r
807 RdpAnyNameExcept except = nc as RdpAnyNameExcept;
\r
808 if (except != null) {
\r
809 checkInvalidAttrNameClass (except.ExceptNameClass);
\r
812 if (nc is RdpAnyName)
\r
815 RdpName n = nc as RdpName;
\r
817 if (n.NamespaceURI == xmlnsNS)
\r
818 throw new RelaxngException ("cannot specify \"" + xmlnsNS + "\" for name of attribute.");
\r
819 if (n.LocalName == "xmlns" && n.NamespaceURI == "")
\r
820 throw new RelaxngException ("cannot specify \"xmlns\" inside empty ns context.");
\r
822 RdpNsName nn = nc as RdpNsName;
\r
823 if (nn.NamespaceURI == "http://www.w3.org/2000/xmlns")
\r
824 throw new RelaxngException ("cannot specify \"" + xmlnsNS + "\" for name of attribute.");
\r
825 RdpNsNameExcept x = nc as RdpNsNameExcept;
\r
827 checkInvalidAttrNameClass (x.ExceptNameClass);
\r
831 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
834 RdpNameClass cnc = nc.Compile (grammar);
\r
835 this.checkInvalidAttrNameClass (cnc);
\r
837 return new RdpAttribute (cnc,
\r
839 p.Compile (grammar) :
\r
843 internal override void CheckConstraints ()
\r
845 NameClass.CheckConstraints (false, false);
\r
848 p.CheckConstraints ();
\r
852 internal class RdpUnresolvedRef : RdpPattern
\r
856 RelaxngGrammar targetGrammar;
\r
857 RdpPattern referencedPattern;
\r
859 public RdpUnresolvedRef (string name, RelaxngGrammar g)
\r
862 // this.parentRef = parentRef;
\r
866 public string Name {
\r
867 get { return name; }
\r
868 set { name = value; }
\r
871 public RdpPattern RefPattern {
\r
872 get { return referencedPattern; }
\r
873 set { referencedPattern = value; }
\r
876 // public bool IsParentRef {
\r
877 // get { return parentRef; }
\r
880 public RelaxngGrammar TargetGrammar {
\r
881 get { return targetGrammar; }
\r
884 public override RelaxngPatternType PatternType {
\r
885 get { return RelaxngPatternType.Ref; }
\r
888 public override RdpContentType ContentType {
\r
889 #if REPLACE_IN_ADVANCE
\r
890 get { throw new InvalidOperationException (); }
\r
892 get { return RdpContentType.Empty; }
\r
897 public override bool Nullable {
\r
899 throw new InvalidOperationException ();
\r
903 internal override RdpPattern ExpandRef (Hashtable defs)
\r
905 RdpPattern target = (RdpPattern) defs [this.name];
\r
906 if (target == null)
\r
907 throw new RelaxngException ("Target definition " + name + " not found.");
\r
908 return target.ExpandRef (defs);
\r
911 internal override void MarkReachableDefs ()
\r
913 TargetGrammar.MarkReacheableDefine (this.name);
\r
916 internal override void CheckConstraints (bool attribute, bool oneOrMore, bool oneOrMoreGroup, bool oneOrMoreInterleave, bool list, bool dataExcept)
\r
918 // throw new InvalidOperationException ();
\r
921 internal override bool ContainsText ()
\r
924 // throw new InvalidOperationException ();
\r
928 public class RelaxngRef : RelaxngPattern
\r
932 public RelaxngRef ()
\r
936 public string Name {
\r
937 get { return name; }
\r
938 set { name = value; }
\r
941 public override RelaxngPatternType PatternType {
\r
942 get { return RelaxngPatternType.Ref; }
\r
945 public override void Write (XmlWriter writer)
\r
947 writer.WriteStartElement ("", "ref", RelaxngGrammar.NamespaceURI);
\r
948 writer.WriteAttributeString ("name", name);
\r
949 writer.WriteEndElement ();
\r
952 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
954 // Important!! This compile method only generates stub.
\r
955 IsCompiled = false;
\r
956 return new RdpUnresolvedRef (name, grammar);
\r
959 internal override void CheckConstraints ()
\r
961 // nothing to check
\r
965 public class RelaxngParentRef : RelaxngPattern
\r
969 public RelaxngParentRef ()
\r
973 public string Name {
\r
974 get { return name; }
\r
975 set { name = value; }
\r
978 public override RelaxngPatternType PatternType {
\r
979 get { return RelaxngPatternType.ParentRef; }
\r
982 public override void Write (XmlWriter writer)
\r
984 writer.WriteStartElement ("", "parentRef", RelaxngGrammar.NamespaceURI);
\r
985 writer.WriteAttributeString ("name", name);
\r
986 writer.WriteEndElement ();
\r
989 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
991 IsCompiled = false;
\r
992 return new RdpUnresolvedRef (name, grammar.ParentGrammar);
\r
995 internal override void CheckConstraints ()
\r
997 // nothing to check
\r
1001 public class RelaxngExternalRef : RelaxngPattern
\r
1006 public RelaxngExternalRef ()
\r
1010 public string Href {
\r
1011 get { return href; }
\r
1012 set { href = value; }
\r
1015 public string NSContext {
\r
1016 get { return ns; }
\r
1017 set { ns = value; }
\r
1020 public override RelaxngPatternType PatternType {
\r
1021 get { return RelaxngPatternType.ExternalRef; }
\r
1024 public override void Write (XmlWriter writer)
\r
1026 writer.WriteStartElement ("", "externalRef", RelaxngGrammar.NamespaceURI);
\r
1027 writer.WriteAttributeString ("href", Href);
\r
1028 writer.WriteEndElement ();
\r
1031 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
1033 grammar.CheckIncludeRecursion (Href);
\r
1034 grammar.IncludedUris.Add (Href, Href);
\r
1035 string uri = Util.ResolveUri (this.BaseUri, href);
\r
1036 RelaxngReader r = new RelaxngReader (new XmlTextReader (uri), ns);
\r
1037 r.MoveToContent ();
\r
1038 RelaxngPattern p = r.ReadPattern ();
\r
1039 p.DataProvider = grammar.Provider;
\r
1041 RdpPattern ret = p.Compile (grammar);
\r
1043 grammar.IncludedUris.Remove (Href);
\r
1048 internal override void CheckConstraints ()
\r
1050 // nothing to check
\r
1054 public class RelaxngOneOrMore : RelaxngSingleContentPattern
\r
1056 public RelaxngOneOrMore ()
\r
1060 public override RelaxngPatternType PatternType {
\r
1061 get { return RelaxngPatternType.OneOrMore; }
\r
1064 public override void Write (XmlWriter writer)
\r
1066 writer.WriteStartElement ("", "oneOrMore", RelaxngGrammar.NamespaceURI);
\r
1067 foreach (RelaxngPattern p in Patterns)
\r
1069 writer.WriteEndElement ();
\r
1072 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
1074 IsCompiled = true;
\r
1075 return new RdpOneOrMore (makeSingle (grammar));
\r
1079 public class RelaxngZeroOrMore : RelaxngSingleContentPattern
\r
1081 public RelaxngZeroOrMore ()
\r
1085 public override RelaxngPatternType PatternType {
\r
1086 get { return RelaxngPatternType.ZeroOrMore; }
\r
1089 public override void Write (XmlWriter writer)
\r
1091 writer.WriteStartElement ("", "zeroOrMore", RelaxngGrammar.NamespaceURI);
\r
1092 foreach (RelaxngPattern p in Patterns)
\r
1094 writer.WriteEndElement ();
\r
1097 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
1099 IsCompiled = true;
\r
1100 return new RdpChoice (
\r
1101 new RdpOneOrMore (makeSingle (grammar)),
\r
1102 RdpEmpty.Instance);
\r
1106 public class RelaxngOptional : RelaxngSingleContentPattern
\r
1108 public RelaxngOptional ()
\r
1112 public override RelaxngPatternType PatternType {
\r
1113 get { return RelaxngPatternType.Optional; }
\r
1116 public override void Write (XmlWriter writer)
\r
1118 writer.WriteStartElement ("", "optional", RelaxngGrammar.NamespaceURI);
\r
1119 foreach (RelaxngPattern p in Patterns)
\r
1121 writer.WriteEndElement ();
\r
1124 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
1126 IsCompiled = true;
\r
1127 return new RdpChoice (
\r
1128 makeSingle (grammar), RdpEmpty.Instance);
\r
1132 public class RelaxngMixed : RelaxngSingleContentPattern
\r
1134 public RelaxngMixed ()
\r
1138 public override RelaxngPatternType PatternType {
\r
1139 get { return RelaxngPatternType.Mixed; }
\r
1142 public override void Write (XmlWriter writer)
\r
1144 writer.WriteStartElement ("", "mixed", RelaxngGrammar.NamespaceURI);
\r
1145 foreach (RelaxngPattern p in Patterns)
\r
1147 writer.WriteEndElement ();
\r
1150 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
1152 IsCompiled = true;
\r
1153 return new RdpInterleave (makeSingle (grammar), RdpText.Instance);
\r
1157 public class RelaxngChoice : RelaxngBinaryContentPattern
\r
1159 public RelaxngChoice ()
\r
1163 public override RelaxngPatternType PatternType {
\r
1164 get { return RelaxngPatternType.Choice; }
\r
1167 public override void Write (XmlWriter writer)
\r
1169 writer.WriteStartElement ("", "choice", RelaxngGrammar.NamespaceURI);
\r
1170 foreach (RelaxngPattern p in Patterns)
\r
1172 writer.WriteEndElement ();
\r
1175 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
1177 IsCompiled = true;
\r
1178 return makeBinary (grammar);
\r
1182 public class RelaxngGroup : RelaxngBinaryContentPattern
\r
1184 public RelaxngGroup ()
\r
1188 public override RelaxngPatternType PatternType {
\r
1189 get { return RelaxngPatternType.Group; }
\r
1192 public override void Write (XmlWriter writer)
\r
1194 writer.WriteStartElement ("", "group", RelaxngGrammar.NamespaceURI);
\r
1195 foreach (RelaxngPattern p in Patterns)
\r
1197 writer.WriteEndElement ();
\r
1200 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
1202 IsCompiled = true;
\r
1203 return makeBinary (grammar);
\r
1207 public class RelaxngInterleave : RelaxngBinaryContentPattern
\r
1209 public RelaxngInterleave ()
\r
1213 public override RelaxngPatternType PatternType {
\r
1214 get { return RelaxngPatternType.Interleave; }
\r
1217 public override void Write (XmlWriter writer)
\r
1219 writer.WriteStartElement ("", "interleave", RelaxngGrammar.NamespaceURI);
\r
1220 foreach (RelaxngPattern p in Patterns)
\r
1222 writer.WriteEndElement ();
\r
1225 internal override RdpPattern Compile (RelaxngGrammar grammar)
\r
1227 IsCompiled = true;
\r
1228 return makeBinary (grammar);
\r
1232 public class RelaxngParam : RelaxngElementBase
\r
1237 public RelaxngParam ()
\r
1241 public RelaxngParam (string name, string value)
\r
1244 this.value = value;
\r
1247 public string Name {
\r
1248 get { return name; }
\r
1249 set { name = value; }
\r
1252 public string Value {
\r
1253 get { return value; }
\r
1254 set { this.value = value; }
\r
1257 public override void Write (XmlWriter writer)
\r
1259 writer.WriteStartElement ("", "param", RelaxngGrammar.NamespaceURI);
\r
1260 writer.WriteAttributeString ("name", name);
\r
1261 writer.WriteString (Value);
\r
1262 writer.WriteEndElement ();
\r
1265 internal RdpParam Compile (RelaxngGrammar grammar)
\r
1267 IsCompiled = true;
\r
1268 return new RdpParam (name, value);
\r
1272 public class RelaxngParamList : CollectionBase
\r
1274 public RelaxngParamList ()
\r
1278 public void Add (RelaxngParam p)
\r
1283 public RelaxngParam this [int i] {
\r
1284 get { return this.List [i] as RelaxngParam; }
\r
1285 set { this.List [i] = value; }
\r
1288 public void Insert (int pos, RelaxngParam p)
\r
1290 List.Insert (pos, p);
\r
1293 public void Remove (RelaxngParam p)
\r
1299 public class RelaxngExcept : RelaxngElementBase
\r
1301 RelaxngPatternList patterns = new RelaxngPatternList ();
\r
1303 public RelaxngExcept ()
\r
1307 public RelaxngPatternList Patterns {
\r
1308 get { return patterns; }
\r
1311 public override void Write (XmlWriter writer)
\r
1313 writer.WriteStartElement ("", "except", RelaxngGrammar.NamespaceURI);
\r
1314 foreach (RelaxngPattern p in Patterns)
\r
1316 writer.WriteEndElement ();
\r
1320 public class RelaxngRefPattern
\r
1322 RelaxngPattern patternRef;
\r
1325 // When we found ref, use it.
\r
1326 public RelaxngRefPattern (string name)
\r
1331 // When we found define, use it.
\r
1332 public RelaxngRefPattern (RelaxngPattern patternRef)
\r
1334 this.patternRef = patternRef;
\r
1337 public string Name {
\r
1338 get { return name; }
\r
1341 public RelaxngPattern PatternRef {
\r
1342 get { return patternRef; }
\r
1343 set { patternRef = value; }
\r