W3C home > Mailing lists > Public > xmlschema-dev@w3.org > October 2004

Re: substitutionGroup across namespaces

From: Mark Proctor <mproctor@codehaus.org>
Date: Mon, 25 Oct 2004 13:14:54 +0200
Message-ID: <417CE02E.7070509@codehaus.org>
To: George Cristian Bina <george@sync.ro>
CC: xmlschema-dev@w3.org

I just added the sequence as shown in your example and I still get the 
following error:
fibonacci-java:
    [java] Using drl: fibonacci.java.drl
    [java] (null: 10, 83): src-resolve: Cannot resolve the name 
'rules:class' to a(n) 'element declaration' component.
    [java] 
(jar:file:/D:/java/workspaces/drools/drools-examples/target/drools-examples-2.0-beta-18.jar!/org/drools/examples/fibonacci/fibonacci.java.drl: 
9, 19) : cvc-complex-type.2.4.a: Invalid content was found starting with 
element 'java:class'. One of '{"http://drools.org/rules":class}' is 
expected.
    [java] 
(jar:file:/D:/java/workspaces/drools/drools-examples/target/drools-examples-2.0-beta-18.jar!/org/drools/examples/fibonacci/fibonacci.java.drl: 
11, 21): cvc-complex-type.2.4.a: Invalid content was found starting with 
element 'java:condition'. One of '{"http://drools.org/rules":parameter, 
"http://drools.org/rules":condition}' is expected.

Mark
George Cristian Bina wrote:

> Hi Mark,
>
> Your rulex.xsd schema is invalid
>
> <xs:complexType>
>  <xs:element ref="rules:class"/>
>  <xs:attribute name="identifier" use="required" type="xs:string"/>
> </xs:complexType>
>
> should be:
>
> <xs:complexType>
>  <xs:sequence>
>   <xs:element ref="rules:class"/>
>  </xs:sequence>
>  <xs:attribute name="identifier" use="required" type="xs:string"/>
> </xs:complexType>
>
> Best regards,
> George
> ---------------------------------------------------------------------
> George Cristian Bina
> <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger
> http://www.oxygenxml.com
>
>
>
> Mark Proctor wrote:
>
>>
>> When processing the following file:
>> <?xml version="1.0"?>
>> <rule-set name="fibonacci"
>>          xmlns="http://drools.org/rules"
>>          xmlns:java="http://drools.org/semantics/java">
>>
>>  <rule name="Recurse" salience="10">
>>    <parameter identifier="f">
>>      <java:class>org.drools.examples.fibonacci.Fibonacci</java:class>
>>    </parameter>
>>    <java:condition>f.getValue() == -1</java:condition>
>>    <java:consequence>
>>      System.err.println( "recurse for " + f.getSequence() );
>>      drools.assertObject( new Fibonacci( f.getSequence() - 1 ) );
>>    </java:consequence>
>>  </rule>
>> </rule-set>
>>
>> I get the following error:
>>    [java] Using drl: fibonacci.java.drl
>>    [java] (null: 10, 83): src-resolve: Cannot resolve the name 
>> 'rules:class' to
>> a(n) 'element declaration' component.
>>    [java] (null: 23, 46): s4s-elt-invalid-content.1: The content of 
>> '#AnonType_
>> parameterrule' is invalid.  Element 'element' is invalid, misplaced, 
>> or occurs t
>> oo often.
>>    [java] 
>> (jar:file:/D:/java/workspaces/drools/drools-examples/target/drools-ex
>> amples-2.0-beta-18.jar!/org/drools/examples/fibonacci/fibonacci.java.drl: 
>> 11, 21
>> ): cvc-complex-type.2.4.a: Invalid content was found starting with 
>> element 'java
>> :condition'. One of '{"http://drools.org/rules":parameter, 
>> "http://drools.org/ru
>> les":condition}' is expected.
>>
>> Yes I'm using xerces 2.6.2 and I make it aware of the .xsds with the 
>> following code:
>> InputStream java = cl.getResourceAsStream( "META-INF/java.xsd" );
>> InputStream python = cl.getResourceAsStream( "META-INF/python.xsd" );
>> InputStream groovy = cl.getResourceAsStream( "META-INF/groovy.xsd" );
>> InputStream rules = cl.getResourceAsStream( "META-INF/rules.xsd" );
>>
>> java.util.List schemaList = new java.util.ArrayList( );
>>
>> if ( java != null ) schemaList.add( java );
>> if ( python != null ) schemaList.add( python );
>> if ( groovy != null ) schemaList.add( groovy );
>> if ( rules != null ) schemaList.add( rules );
>>
>> parser.setProperty( JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA );
>> parser.setProperty(SCHEMA_SOURCE,( InputStream[] ) 
>> schemaList.toArray( new InputStream[0] ) );
>>
>> For reference these are the exact files I'm using to to the validation:
>> rulex.xsd
>> <?xml version="1.0" encoding="UTF-8"?>
>> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>>           targetNamespace="http://drools.org/rules"
>>           elementFormDefault="qualified"
>>           xmlns:rules="http://drools.org/rules">
>>
>>  <xs:element name="rule-set">
>>    <xs:complexType>
>>      <xs:sequence>
>>        <xs:element minOccurs="0" maxOccurs="unbounded" 
>> ref="rules:rule"/>
>>      </xs:sequence>
>>      <xs:attribute name="name" use="required" type="xs:string"/>
>>      <xs:attribute name="description" type="xs:string"/>
>>    </xs:complexType>
>>  </xs:element>
>>
>>  <xs:element name="rule">
>>    <xs:complexType>
>>      <xs:sequence>
>>
>>        <xs:element name="parameter" maxOccurs="unbounded" >
>>          <xs:complexType>
>>              <xs:element ref="rules:class"/>
>>            <xs:attribute name="identifier" use="required" 
>> type="xs:string"/>
>>          </xs:complexType>
>>        </xs:element>
>>
>>
>>        <xs:element ref="rules:condition" maxOccurs="unbounded"/>
>>
>>
>>        <xs:element ref="rules:consequence"/>
>>
>>      </xs:sequence>
>>      <xs:attribute name="name" use="required" type="xs:string"/>
>>      <xs:attribute name="salience" type="xs:integer"/>
>>      <xs:attribute name="no-loop" type="xs:boolean"/>
>>      <xs:attribute name="description" type="xs:string"/>
>>    </xs:complexType>
>>
>>  </xs:element>
>>
>>  <xs:element name="class"       type="xs:string" abstract="true"/>
>>  <xs:element name="condition"   type="xs:string" abstract="true"/>
>>  <xs:element name="consequence" type="xs:string" abstract="true"/>
>>
>> </xs:schema>
>> java.xsd
>> <?xml version="1.0" encoding="UTF-8"?>
>> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>> targetNamespace="http://drools.org/semantics/java"
>> elementFormDefault="qualified"
>> xmlns:java="http://drools.org/semantics/java"
>> xmlns:rules="http://drools.org/rules">
>>
>> <xs:import namespace="http://drools.org/rules"/>
>>
>> <xs:element name="class"       type="xs:string" 
>> substitutionGroup="rules:class"/>
>> <xs:element name="condition"   type="xs:string" 
>> substitutionGroup="rules:condition"/>
>> <xs:element name="consequence" type="xs:string" 
>> substitutionGroup="rules:consequence"/>
>>
>> </xs:schema>
>>
>> Hope thats enough information.
>>
>> Mark
>>
>>
>>
>>
>> George Cristian Bina wrote:
>>
>>>
>>> Hi Mark,
>>>
>>> I tried your files and they work without any problems. I saved the 
>>> first schema as rules.xsd, the second as java.xsd and added a 
>>> schemaLocation to the import element, then the following sample:
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <rule-set xmlns="http://drools.org/rules" 
>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>>     xsi:schemaLocation="http://drools.org/semantics/java java.xsd 
>>> http://drools.org/rules rules.xsd" name="test">
>>>     <rule name="r1">
>>>         <parameter identifier="test">
>>>             <class xmlns="http://drools.org/semantics/java"/>
>>>         </parameter>
>>>         <condition xmlns="http://drools.org/semantics/java"/>
>>>         <consequence xmlns="http://drools.org/semantics/java"/>
>>>     </rule>
>>> </rule-set>
>>>
>>> is valid according with Xerces 2.6.2 (from your similar post on the 
>>> xerces-j-dev list I guess you are using Xerces).
>>>
>>> Hope that helps,
>>> George
>>> ---------------------------------------------------------------------
>>> George Cristian Bina
>>> <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger
>>> http://www.oxygenxml.com
>>>
>>>
>>> Mark Proctor wrote:
>>>
>>>> In the http://drools.org project we have a base name space:
>>>> http://drools.org/rules
>>>> And three semantic namespaces:
>>>> http://drools.org/semantic/java
>>>> http://drools.org/semantic/groovy
>>>> http://drools.org/semantic/python
>>>>
>>>> Each namespace xsd is in its own file.
>>>>
>>>> A rule is made up of classes, conditions, consequences and at the 
>>>> moment in the rule.xsd we use the choice feature to allow a user to 
>>>> specify which one they want:
>>>>        <xs:choice>
>>>>          <xs:element ref="java:consequence"/>
>>>>          <xs:element ref="groovy:consequence"/>
>>>>          <xs:element ref="python:consequence"/>
>>>>        </xs:choice>
>>>> However this has the side affect of coupling the rule.xsd to the 
>>>> semantic xsds, and as a user only has the semantic xsds in the 
>>>> classpath that they wish to use they receive errors about the other 
>>>> namespaces, plus it makes it difficult for users wishing to add 
>>>> more semantic implementations as they need to alter rules.xsd.
>>>>
>>>> To try and remove this coupling we wanted to use some sort of 
>>>> abstract class in rules.xsd to specify a type, which the semantics 
>>>> would then extend. It seems the only way to do this is with 
>>>> substitutionalGroup, however it refuses to work when the elements 
>>>> are in different files and namespaces.
>>>>
>>>> I have included some sample code, any help would be greatly 
>>>> appreciated.
>>>>
>>>> Regards
>>>>
>>>> Mark
>>>>
>>>> -------------------------------
>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>>>>           targetNamespace="http://drools.org/rules"
>>>>           elementFormDefault="qualified"
>>>>           xmlns:rules="http://drools.org/rules">
>>>>
>>>>  <xs:element name="rule-set">
>>>>    <xs:complexType>
>>>>      <xs:sequence>
>>>>        <xs:element minOccurs="0" maxOccurs="unbounded" 
>>>> ref="rules:rule"/>
>>>>      </xs:sequence>
>>>>      <xs:attribute name="name" use="required" type="xs:string"/>
>>>>      <xs:attribute name="description" type="xs:string"/>
>>>>    </xs:complexType>
>>>>  </xs:element>
>>>>
>>>>  <xs:element name="rule">
>>>>    <xs:complexType>
>>>>      <xs:sequence>
>>>>
>>>>        <xs:element name="parameter" maxOccurs="unbounded" >
>>>>          <xs:complexType>
>>>>            <xs:sequence>
>>>>              <xs:element ref="rules:class"/>
>>>>            </xs:sequence>
>>>>            <xs:attribute name="identifier" use="required" 
>>>> type="xs:string"/>
>>>>          </xs:complexType>
>>>>        </xs:element>
>>>>
>>>>        <xs:element ref="rules:condition" maxOccurs="unbounded" />
>>>>
>>>>        <xs:element ref="rules:consequence"/>
>>>>
>>>>      </xs:sequence>
>>>>      <xs:attribute name="name" use="required" type="xs:string"/>
>>>>      <xs:attribute name="salience" type="xs:integer"/>
>>>>      <xs:attribute name="no-loop" type="xs:boolean"/>
>>>>      <xs:attribute name="description" type="xs:string"/>
>>>>    </xs:complexType>
>>>>    </xs:element>
>>>>
>>>>  <xs:element name="class"       type="xs:string" abstract="true"/>
>>>>  <xs:element name="condition"   type="xs:string" abstract="true"/>
>>>>  <xs:element name="consequence" type="xs:string" abstract="true"/>
>>>>
>>>> </xs:schema>
>>>> -------------------------------------------
>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>>>>  targetNamespace="http://drools.org/semantics/java"
>>>>  elementFormDefault="qualified"
>>>>  xmlns:java="http://drools.org/semantics/java"
>>>>  xmlns:rules="http://drools.org/rules">
>>>>
>>>>  <xs:import namespace="http://drools.org/rules"/>
>>>>
>>>>  <xs:element name="class"       type="xs:string" 
>>>> substitutionGroup="rules:class"/>
>>>>  <xs:element name="condition"   type="xs:string" 
>>>> substitutionGroup="rules:condition"/>
>>>>  <xs:element name="consequence" type="xs:string" 
>>>> substitutionGroup="rules:consequence"/>
>>>>
>>>> </xs:schema>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>
>
Received on Monday, 25 October 2004 11:15:28 UTC

This archive was generated by hypermail 2.3.1 : Wednesday, 5 February 2014 07:15:11 UTC