From d8e27befb9d2fb0e209696cb96cf567e0d45991c Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 26 Jan 2013 17:19:42 +0000 Subject: [PATCH] Fix xml completion for SubstitutionGroup elements. --- .../Project/Src/XmlSchemaCompletion.cs | 14 +- .../XmlEditor/Test/Resources/xslt.xsd | 1134 +++++++++++++++++ .../XmlEditor/Test/Schema/XsltSchemaTests.cs | 48 + .../XmlEditor/Test/Utils/ResourceManager.cs | 8 + .../XmlEditor/Test/XmlEditor.Tests.csproj | 4 + .../DisplayBindings/XmlEditor/XmlEditor.sln | 2 +- 6 files changed, 1208 insertions(+), 2 deletions(-) create mode 100644 src/AddIns/DisplayBindings/XmlEditor/Test/Resources/xslt.xsd create mode 100644 src/AddIns/DisplayBindings/XmlEditor/Test/Schema/XsltSchemaTests.cs diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletion.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletion.cs index 63906827bb..48b2b9f33c 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletion.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletion.cs @@ -335,11 +335,23 @@ namespace ICSharpCode.XmlEditor { XmlSchemaComplexType complexType = element.SchemaType as XmlSchemaComplexType; if (complexType == null) { - complexType = FindNamedType(schema, element.SchemaTypeName); + if (element.SchemaTypeName.IsEmpty) { + return GetComplexTypeFromSubstitutionGroup(element); + } + return FindNamedType(schema, element.SchemaTypeName); } return complexType; } + XmlSchemaComplexType GetComplexTypeFromSubstitutionGroup(XmlSchemaElement element) + { + if (!element.SubstitutionGroup.IsEmpty) { + XmlSchemaElement substitutedElement = FindElement(element.SubstitutionGroup); + return GetElementAsComplexType(substitutedElement); + } + return null; + } + /// /// Handler for schema validation errors. /// diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/Resources/xslt.xsd b/src/AddIns/DisplayBindings/XmlEditor/Test/Resources/xslt.xsd new file mode 100644 index 0000000000..2b71d914c5 --- /dev/null +++ b/src/AddIns/DisplayBindings/XmlEditor/Test/Resources/xslt.xsd @@ -0,0 +1,1134 @@ + + + + + + + + This is a schema for XSLT 2.0 stylesheets. + + It defines all the elements that appear in the XSLT namespace; it also + provides hooks that allow the inclusion of user-defined literal result elements, + extension instructions, and top-level data elements. + + The schema is derived (with kind permission) from a schema for XSLT 1.0 stylesheets + produced by Asir S Vedamuthu of WebMethods Inc. + + This schema is available for use under the conditions of the W3C Software License + published at http://www.w3.org/Consortium/Legal/copyright-software-19980720 + + The schema is organized as follows: + + PART A: definitions of complex types and model groups used as the basis + for element definitions + PART B: definitions of individual XSLT elements + PART C: definitions for literal result elements + PART D: definitions of simple types used in attribute definitions + + This schema does not attempt to define all the constraints that apply to a valid + XSLT 2.0 stylesheet module. It is the intention that all valid stylesheet modules + should conform to this schema; however, the schema is non-normative and in the event + of any conflict, the text of the Recommendation takes precedence. + + This schema does not implement the special rules that apply when a stylesheet + has sections that use forwards-compatible-mode. In this mode, setting version="3.0" + allows elements from the XSLT namespace to be used that are not defined in XSLT 2.0. + + Simplified stylesheets (those with a literal result element as the outermost element) + will validate against this schema only if validation starts in lax mode. + + This version is dated 2007-03-16 + Authors: Michael H Kay, Saxonica Limited + Jeni Tennison, Jeni Tennison Consulting Ltd. + + 2007-03-15: added xsl:document element + revised xsl:sequence element + see http://www.w3.org/Bugs/Public/show_bug.cgi?id=4237 + + + + + + + + + + + + + + + + + PART A: definitions of complex types and model groups used as the basis + for element definitions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PART B: definitions of individual XSLT elements + Elements are listed in alphabetical order. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PART C: definition of literal result elements + + There are three ways to define the literal result elements + permissible in a stylesheet. + + (a) do nothing. This allows any element to be used as a literal + result element, provided it is not in the XSLT namespace + + (b) declare all permitted literal result elements as members + of the xsl:literal-result-element substitution group + + (c) redefine the model group xsl:result-elements to accommodate + all permitted literal result elements. + + Literal result elements are allowed to take certain attributes + in the XSLT namespace. These are defined in the attribute group + literal-result-element-attributes, which can be included in the + definition of any literal result element. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PART D: definitions of simple types used in stylesheet attributes + + + + + + + + This type is used for all attributes that allow an attribute value template. + The general rules for the syntax of attribute value templates, and the specific + rules for each such attribute, are described in the XSLT 2.0 Recommendation. + + + + + + + + + A string containing exactly one character. + + + + + + + + + + + An XPath 2.0 expression. + + + + + + + + + + + Describes how type annotations in source documents are handled. + + + + + + + + + + + + + The level attribute of xsl:number: + one of single, multiple, or any. + + + + + + + + + + + + + The mode attribute of xsl:apply-templates: + either a QName, or #current, or #default. + + + + + + + + + + + + + + + + The mode attribute of xsl:template: + either a list, each member being either a QName or #default; + or the value #all + + + + + + + + + + + + + + + + + + + + + + + + + + + + A list of NameTests, as defined in the XPath 2.0 Recommendation. + Each NameTest is either a QName, or "*", or "prefix:*", or "*:localname" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The method attribute of xsl:output: + Either one of the recognized names "xml", "xhtml", "html", "text", + or a QName that must include a prefix. + + + + + + + + + + + + + + + + + + + + + + + A match pattern as defined in the XSLT 2.0 Recommendation. + The syntax for patterns is a restricted form of the syntax for + XPath 2.0 expressions. + + + + + + + + + Either a namespace prefix, or #default. + Used in the xsl:namespace-alias element. + + + + + + + + + + + + + + + A list of QNames. + Used in the [xsl:]use-attribute-sets attribute of various elements, + and in the cdata-section-elements attribute of xsl:output + + + + + + + + + A QName. + This schema does not use the built-in type xs:QName, but rather defines its own + QName type. Although xs:QName would define the correct validation on these attributes, + a schema processor would expand unprefixed QNames incorrectly when constructing the PSVI, + because (as defined in XML Schema errata) an unprefixed xs:QName is assumed to be in + the default namespace, which is not the correct assumption for XSLT. + The data type is defined as a restriction of the built-in type Name, restricted + so that it can only contain one colon which must not be the first or last character. + + + + + + + + + + + The description of a data type, conforming to the + SequenceType production defined in the XPath 2.0 Recommendation + + + + + + + + + + + + + + + Describes different ways of type-annotating an element or attribute. + + + + + + + + + + + + Describes different ways of type-annotating an element or attribute. + + + + + + + + + + + + + + One of the values "yes" or "no". + + + + + + + + + + + + One of the values "yes" or "no" or "omit". + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/XsltSchemaTests.cs b/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/XsltSchemaTests.cs new file mode 100644 index 0000000000..7b47dda446 --- /dev/null +++ b/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/XsltSchemaTests.cs @@ -0,0 +1,48 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.XmlEditor; +using NUnit.Framework; +using XmlEditor.Tests.Utils; + +namespace XmlEditor.Tests.Schema +{ + [TestFixture] + public class XsltSchemaTests + { + string namespaceURI = "http://www.w3.org/1999/XSL/Transform"; + XmlSchemaCompletion schemaCompletion; + + [TestFixtureSetUp] + public void SetUp() + { + schemaCompletion = new XmlSchemaCompletion(ResourceManager.ReadXsltSchema()); + } + + [Test] + public void GetChildElementCompletion_StylesheetElement_SubstitutionGroupUsedForTemplateAndTemplateElementReturned() + { + var path = new XmlElementPath(); + path.AddElement(new QualifiedName("stylesheet", namespaceURI)); + + XmlCompletionItemCollection completionItems = schemaCompletion.GetChildElementCompletion(path); + bool contains = completionItems.Contains("template"); + + Assert.IsTrue(contains); + } + + [Test] + public void GetAttributeCompletion_TemplateElementIsChildOfStylesheetElement_SubstitutionGroupUsedForTemplateAndMatchAttributeReturned() + { + var path = new XmlElementPath(); + path.AddElement(new QualifiedName("stylesheet", namespaceURI)); + path.AddElement(new QualifiedName("template", namespaceURI)); + + XmlCompletionItemCollection completionItems = schemaCompletion.GetAttributeCompletion(path); + bool contains = completionItems.Contains("match"); + + Assert.IsTrue(contains); + } + } +} diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/Utils/ResourceManager.cs b/src/AddIns/DisplayBindings/XmlEditor/Test/Utils/ResourceManager.cs index 6df5d1d277..39bb1ef7ff 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Test/Utils/ResourceManager.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Test/Utils/ResourceManager.cs @@ -35,6 +35,14 @@ namespace XmlEditor.Tests.Utils return manager.ReadXml("XMLSchema.xsd"); } + /// + /// Reads the XSL Transforms schema. + /// + public static StreamReader ReadXsltSchema() + { + return manager.ReadXml("xslt.xsd"); + } + /// /// Returns the xml read from the specified file which is embedded /// in this assembly as a resource. diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/XmlEditor.Tests.csproj b/src/AddIns/DisplayBindings/XmlEditor/Test/XmlEditor.Tests.csproj index f34b08fa5f..abe19aa494 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Test/XmlEditor.Tests.csproj +++ b/src/AddIns/DisplayBindings/XmlEditor/Test/XmlEditor.Tests.csproj @@ -168,6 +168,7 @@ + @@ -386,5 +387,8 @@ + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/XmlEditor/XmlEditor.sln b/src/AddIns/DisplayBindings/XmlEditor/XmlEditor.sln index 49f718f1d1..2085830909 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/XmlEditor.sln +++ b/src/AddIns/DisplayBindings/XmlEditor/XmlEditor.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 -# SharpDevelop 4.1.0.7289-alpha +# SharpDevelop 4.3 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor", "Project\XmlEditor.csproj", "{DCA2703D-250A-463E-A68A-07ED105AE6BD}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor.Tests", "Test\XmlEditor.Tests.csproj", "{FC0FE702-A87D-4D70-A9B6-1ECCD611125F}"