e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
156 lines
5.5 KiB
C#
156 lines
5.5 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="InputScopeManager.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
// <owner current="true" primary="true">[....]</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;
|
|
}
|
|
}
|
|
}
|
|
|