// Copyright (c) Microsoft Corporation. All rights reserved. // using System; using System.Collections.Generic; using System.Xml; using System.Xml.XPath; using System.Xml.Xsl; namespace Microsoft.Ddue.Tools { public class BuildContext { private CustomContext context = new CustomContext(); // Namespace control public void AddNamespace (string prefix, string uri) { context.AddNamespace(prefix, uri); } public string LookupNamespace (string prefix) { return( context.LookupNamespace(prefix) ); } public bool RemoveNamespace (string prefix) { string uri = LookupNamespace(prefix); if (uri == null) { return(false); } else { context.RemoveNamespace(prefix, uri); return(true); } } public void ClearNamespaces () { } // Variable control public void AddVariable (string name, string value) { context[name] = value; } public string LookupVariable (string name) { return( context[name] ); } public bool RemoveVariable (string name) { return( context.ClearVariable(name) ); } public void ClearVariables () { context.ClearVariables(); } public string this [string name] { get { return(context[name]); } set { context[name] = value; } } // Function control // The context for use in XPath queries public XsltContext XsltContext { get { return(context); } } // Load data from config public void Load (XPathNavigator configuration) { XPathNodeIterator namespaceNodes = configuration.Select("namespace"); foreach (XPathNavigator namespaceNode in namespaceNodes) { string prefixValue = namespaceNode.GetAttribute("prefix", String.Empty); string uriValue = namespaceNode.GetAttribute("uri", String.Empty); AddNamespace(prefixValue, uriValue); } } } public class CustomContext : XsltContext { public CustomContext() : base() {} // variable control private Dictionary variables = new Dictionary(); public string this [string variable] { get { return(variables[variable].Evaluate(this).ToString()); } set { variables[variable] = new CustomVariable(value); } } public bool ClearVariable (string name) { return( variables.Remove(name) ); } public void ClearVariables () { variables.Clear(); } // Implementation of XsltContext methods public override IXsltContextVariable ResolveVariable (string prefix, string name) { return( variables[name] ); } public override IXsltContextFunction ResolveFunction (string prefix, string name, XPathResultType[] argumentTypes) { throw new NotImplementedException(); } public override int CompareDocument (string baseUri, string nextBaseUri) { return(0); } public override bool Whitespace { get { return(true); } } public override bool PreserveWhitespace (XPathNavigator node) { return(true); } } internal struct CustomVariable : IXsltContextVariable { public CustomVariable (string value) { this.value = value; } private string value; public bool IsLocal { get { return(false); } } public bool IsParam { get { return(false); } } public XPathResultType VariableType { get { return(XPathResultType.String); } } public Object Evaluate (XsltContext context) { return(value); } } }