5 // Ben Maurer (bmaurer@users.sourceforge.net)
6 // Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)
9 // (C) 2003 Atsushi Enomoto
13 using System.Collections;
15 using System.Xml.XPath;
18 namespace Mono.Xml.Xsl.Operations {
19 public class XslNumber : XslCompiledElement {
22 // level = "single" | "multiple" | "any"
23 XslNumberingLevel level;
25 XPathExpression count;
28 // value = number-expression
29 XPathExpression value;
30 // format = { string }
34 // letter-value = { "alphabetic" | "traditional" }
36 // grouping-separator = { char }
37 XslAvt groupingSeparator;
38 // grouping-size = { number } />
41 public XslNumber (Compiler c) : base (c) {}
43 protected override void Compile (Compiler c)
45 switch (c.GetAttribute ("level"))
48 level = XslNumberingLevel.Single;
51 level = XslNumberingLevel.Multiple;
54 level = XslNumberingLevel.Any;
59 level = XslNumberingLevel.Single; // single == default
63 count = c.CompilePattern (c.GetAttribute ("count"));
64 from = c.CompilePattern (c.GetAttribute ("from"));
65 value = c.CompileExpression (c.GetAttribute ("value"));
67 if (value != null && value.ReturnType != XPathResultType.Number && value.ReturnType != XPathResultType.Any)
68 throw new Exception ("The expression for attribute 'value' must return a number");
70 format = c.ParseAvtAttribute ("format");
71 lang = c.ParseAvtAttribute ("lang");
72 letterValue = c.ParseAvtAttribute ("letter-value");
73 groupingSeparator = c.ParseAvtAttribute ("grouping-separator");
74 groupingSize = c.ParseAvtAttribute ("grouping-size");
77 public override void Evaluate (XslTransformProcessor p)
79 p.Out.WriteString (GetFormat (p));
82 XslNumberFormatter GetNumberFormatter (XslTransformProcessor p)
84 string format = "1. ";
86 string letterValue = null;
87 char groupingSeparator = '\0';
90 if (this.format != null)
91 format = this.format.Evaluate (p);
93 if (this.lang != null)
94 lang = this.lang.Evaluate (p);
96 if (this.letterValue != null)
97 letterValue = this.letterValue.Evaluate (p);
99 if (this.groupingSeparator != null)
100 groupingSeparator = this.groupingSeparator.Evaluate (p) [0];
102 if (this.groupingSize != null)
103 groupingSize = int.Parse (this.groupingSize.Evaluate (p));
105 return new XslNumberFormatter (format, lang, letterValue, groupingSeparator, groupingSize);
108 string GetFormat (XslTransformProcessor p)
110 XslNumberFormatter nf = GetNumberFormatter (p);
112 if (this.value != null)
113 return nf.Format ((int)p.EvaluateNumber (this.value)); // TODO: Correct rounding
115 switch (this.level) {
116 case XslNumberingLevel.Single:
117 throw new NotImplementedException ();
118 case XslNumberingLevel.Multiple:
119 throw new NotImplementedException ();
120 case XslNumberingLevel.Any:
121 throw new NotImplementedException ();
123 throw new Exception ("Should not get here");
127 class XslNumberFormatter {
128 public XslNumberFormatter (string format, string lang, string letterValue, char groupingSeparator, int groupingSize)
130 throw new NotImplementedException ();
133 public int NumbersNeeded {
134 get { throw new NotImplementedException (); }
137 // return the format for a single value, ie, if using Single or Any
138 public string Format (int value)
140 throw new NotImplementedException ();
143 // format for an array of numbers.
144 public string Format (int [] values)
146 throw new NotImplementedException ();
151 public enum XslNumberingLevel