1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
//------------------------------------------------------------------------------
// <copyright file="InputScopeManager.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
// <owner current="true" primary="true">Microsoft</owner>
//------------------------------------------------------------------------------
namespace System.Xml.Xsl.XsltOld {
using Res = System.Xml.Utils.Res;
using System;
using System.Diagnostics;
using System.Xml;
using System.Xml.XPath;
internal class InputScopeManager {
private InputScope scopeStack;
private string defaultNS = string.Empty;
private XPathNavigator navigator; // We need this nsvigator for document() function implementation
public InputScopeManager(XPathNavigator navigator, InputScope rootScope) {
this.navigator = navigator;
this.scopeStack = rootScope;
}
internal InputScope CurrentScope {
get { return this.scopeStack; }
}
internal InputScope VariableScope {
get {
Debug.Assert(this.scopeStack != null);
Debug.Assert(this.scopeStack.Parent != null);
return this.scopeStack.Parent;
}
}
internal InputScopeManager Clone() {
InputScopeManager manager = new InputScopeManager(this.navigator, null);
manager.scopeStack = this.scopeStack;
manager.defaultNS = this.defaultNS;
return manager;
}
public XPathNavigator Navigator {
get {return this.navigator;}
}
internal InputScope PushScope() {
this.scopeStack = new InputScope(this.scopeStack);
return this.scopeStack;
}
internal void PopScope() {
Debug.Assert(this.scopeStack != null, "Push/Pop disbalance");
if (this.scopeStack == null) {
return;
}
for (NamespaceDecl scope = this.scopeStack.Scopes; scope != null; scope = scope.Next) {
this.defaultNS = scope.PrevDefaultNsUri;
}
this.scopeStack = this.scopeStack.Parent;
}
internal void PushNamespace(string prefix, string nspace) {
Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
Debug.Assert(prefix != null);
Debug.Assert(nspace != null);
this.scopeStack.AddNamespace(prefix, nspace, this.defaultNS);
if (prefix == null || prefix.Length == 0) {
this.defaultNS = nspace;
}
}
// CompileContext
public string DefaultNamespace {
get { return this.defaultNS; }
}
private string ResolveNonEmptyPrefix(string prefix) {
Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
Debug.Assert(!string.IsNullOrEmpty(prefix));
if (prefix == "xml") {
return XmlReservedNs.NsXml;
}
else if (prefix == "xmlns") {
return XmlReservedNs.NsXmlNs;
}
for (InputScope inputScope = this.scopeStack; inputScope != null; inputScope = inputScope.Parent) {
string nspace = inputScope.ResolveNonAtom(prefix);
if (nspace != null) {
return nspace;
}
}
throw XsltException.Create(Res.Xslt_InvalidPrefix, prefix);
}
public string ResolveXmlNamespace(string prefix) {
Debug.Assert(prefix != null);
if (prefix.Length == 0) {
return this.defaultNS;
}
return ResolveNonEmptyPrefix(prefix);
}
public string ResolveXPathNamespace(string prefix) {
Debug.Assert(prefix != null);
if (prefix.Length == 0) {
return string.Empty;
}
return ResolveNonEmptyPrefix(prefix);
}
internal void InsertExtensionNamespaces(string[] nsList) {
Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
Debug.Assert(nsList != null);
for (int idx = 0; idx < nsList.Length; idx++) {
this.scopeStack.InsertExtensionNamespace(nsList[idx]);
}
}
internal bool IsExtensionNamespace(String nspace) {
Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
for (InputScope inputScope = this.scopeStack; inputScope != null; inputScope = inputScope.Parent) {
if (inputScope.IsExtensionNamespace( nspace )) {
return true;
}
}
return false;
}
internal void InsertExcludedNamespaces(string[] nsList) {
Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
Debug.Assert(nsList != null);
for (int idx = 0; idx < nsList.Length; idx++) {
this.scopeStack.InsertExcludedNamespace(nsList[idx]);
}
}
internal bool IsExcludedNamespace(String nspace) {
Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
for (InputScope inputScope = this.scopeStack; inputScope != null; inputScope = inputScope.Parent) {
if (inputScope.IsExcludedNamespace( nspace )) {
return true;
}
}
return false;
}
}
}
|