xsl-list
[Top] [All Lists]

[xsl] RE: Best way to represent an item and its context?

2011-09-17 14:01:45
Hi Folks,

Many thanks for the responses. 

Please allow me to provide more insight into what I am doing and inquire why I 
am getting an "ArrayIndexOutOfBoundsException" with Saxon.

Recall that an XML Schema may be imported or included by another XML Schema. 
That importing/including schema is the "context" for the schema. Further, there 
may be a schema that imports/includes the importing/including schema and is its 
context. And so on.

I'd like to represent a schema in its context, i.e., a "schema-in-context".

Here are two simple functions to do it. The first function takes a schema and 
creates a schema-in-context that has an empty context. The second takes a 
schema and its context.

    <xsl:function name="sic:schema-in-context">
        <xsl:param name="schema" as="element()"/>
        
        <schema-in-context>
            <schema><xsl:sequence select="$schema" /></schema>
            <schema-in-context />
        </schema-in-context>
        
    </xsl:function>
    
    <xsl:function name="sic:schema-in-context">
        <xsl:param name="schema" as="element()"/> 
        <xsl:param name="schema-in-context" as="element()"/>
        
        <schema-in-context>
            <schema><xsl:sequence select="$schema" /></schema>
            <xsl:sequence select="$schema-in-context" />
        </schema-in-context>   
    </xsl:function>

Do you see anything wrong with those? Apparently there is something wrong, 
since I get an "ArrayIndexOutOfBoundsException" with Saxon, as I describe next.

Here's a variable consisting of three schemas:

            <xsl:variable name="schemas">
                <schemas>
                    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema";
                                            
targetNamespace="http://www.test.org";
                                            xmlns="http://www.test.org";
                                           elementFormDefault="qualified"> 
                        
                        <xsd:include schemaLocation="schema2.xsd" />
                        
                        <xsd:element name="Title" type="xsd:string" />
                        <xsd:element name="Author" type="Author" />
                        
                    </xsd:schema>
                    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema";
                                            elementFormDefault="qualified"> 
                        
                        <xsd:include schemaLocation="schema3.xsd" />
                        
                        <xsd:simpleType name="Author">
                            <xsd:restriction base="xsd:string">
                                <xsd:maxLength value="20" />
                            </xsd:restriction>
                        </xsd:simpleType>
                        
                    </xsd:schema>
                    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema";
                                            elementFormDefault="qualified"> 
                        
                        <xsd:element name="Date" type="xsd:date" />
                        
                    </xsd:schema>
                </schemas>
            </xsl:variable>

I obtain the first schema and invoke the schema-in-context function with it:

            <xsl:variable name="schema-in-context-1" 
select="sic:schema-in-context($schemas/schemas/xs:schema[1])" />
            
            <Test1>
                <xsl:sequence select="$schema-in-context-1" />
            </Test1>

The output is perfect.

I obtain the second schema and invoke the schema-in-context function with it 
and $schema-in-context-1:

            <xsl:variable name="schema-in-context-2" 
select="sic:schema-in-context($schemas/schemas/xs:schema[2], 
$schema-in-context-1)" />
            
            <Test2>
                <xsl:sequence select="$schema-in-context-2" />
            </Test2>

Again, the output is perfect.

Now, things go bad. I obtain the third schema and invoke the schema-in-context 
function with it and $schema-in-context-2:

            <xsl:variable name="schema-in-context-3" 
select="sic:schema-in-context($schemas/schemas/xs:schema[3], 
$schema-in-context-2)" />
            
            <Test3>
                <xsl:sequence select="$schema-in-context-3" />
            </Test3>

I get this exception:

java.lang.ArrayIndexOutOfBoundsException: -1
        at 
net.sf.saxon.om.NamePool.getPrefixFromNamespaceCode(NamePool.java:937)
        at net.sf.saxon.serialize.XMLEmitter.namespace(XMLEmitter.java:369)
        at net.sf.saxon.event.ProxyReceiver.namespace(ProxyReceiver.java:140)
        at 
net.sf.saxon.event.NamespaceReducer.namespace(NamespaceReducer.java:122)
        at 
net.sf.saxon.event.ComplexContentOutputter.startContent(ComplexContentOutputter.java:571)
        at 
net.sf.saxon.event.ComplexContentOutputter.startElement(ComplexContentOutputter.java:180)
        at net.sf.saxon.tree.tiny.TinyElementImpl.copy(TinyElementImpl.java:312)

        at 
net.sf.saxon.event.ComplexContentOutputter.append(ComplexContentOutputter.java:521)
        at net.sf.saxon.expr.Expression.process(Expression.java:490)
        at 
net.sf.saxon.expr.CardinalityChecker.process(CardinalityChecker.java:268)
        at 
net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:318)
        at 
net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:269)
        at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:569)
        at net.sf.saxon.expr.instruct.Instruction.process(Instruction.java:123)
        at 
net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:318)
        at 
net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:269)
        at net.sf.saxon.expr.instruct.Instruction.process(Instruction.java:123)
        at 
net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:318)
        at 
net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:269)
        at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:569)
        at 
net.sf.saxon.expr.LetExpression.processLeavingTail(LetExpression.java:567)
        at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:569)
        at net.sf.saxon.expr.instruct.Instruction.process(Instruction.java:123)
        at net.sf.saxon.expr.LetExpression.process(LetExpression.java:409)
        at 
net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:318)
        at 
net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:269)
        at 
net.sf.saxon.expr.instruct.Template.applyLeavingTail(Template.java:208)
        at 
net.sf.saxon.expr.instruct.ApplyTemplates.applyTemplates(ApplyTemplates.java:368)
        at net.sf.saxon.Controller.transformDocument(Controller.java:1887)
        at net.sf.saxon.Controller.transform(Controller.java:1737)
        at net.sf.saxon.Transform.processFile(Transform.java:938)
        at net.sf.saxon.Transform.doTransform(Transform.java:572)
        at net.sf.saxon.Transform.main(Transform.java:72)
Fatal error during transformation: java.lang.ArrayIndexOutOfBoundsException: -1

After much effort I am unable to determine what the problem is. Any help you 
could provide would be much appreciated. Below is the complete stylesheet.

/Roger

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                           xmlns:xs="http://www.w3.org/2001/XMLSchema";
                           
xmlns:sic="http://www.schema-library.org/schema-in-context";
                          version="2.0">
    
    <xsl:function name="sic:schema-in-context">
        <xsl:param name="schema" as="element()"/>
        
        <schema-in-context>
            <schema><xsl:sequence select="$schema" /></schema>
            <schema-in-context />
        </schema-in-context>
        
    </xsl:function>
    
    <xsl:function name="sic:schema-in-context">
        <xsl:param name="schema" as="element()"/> 
        <xsl:param name="schema-in-context" as="element()"/>
        
        <schema-in-context>
            <schema><xsl:sequence select="$schema" /></schema>
            <xsl:sequence select="$schema-in-context" />
        </schema-in-context>   
    </xsl:function>
    
    <xsl:template match="/">
        <Results>
            
            <xsl:variable name="schemas">
                <schemas>
                    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema";
                                            
targetNamespace="http://www.test.org";
                                            xmlns="http://www.test.org";
                                           elementFormDefault="qualified"> 
                        
                        <xsd:include schemaLocation="schema2.xsd" />
                        
                        <xsd:element name="Title" type="xsd:string" />
                        <xsd:element name="Author" type="Author" />
                        
                    </xsd:schema>
                    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema";
                                            elementFormDefault="qualified"> 
                        
                        <xsd:include schemaLocation="schema3.xsd" />
                        
                        <xsd:simpleType name="Author">
                            <xsd:restriction base="xsd:string">
                                <xsd:maxLength value="20" />
                            </xsd:restriction>
                        </xsd:simpleType>
                        
                    </xsd:schema>
                    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema";
                                            elementFormDefault="qualified"> 
                        
                        <xsd:element name="Date" type="xsd:date" />
                        
                    </xsd:schema>
                </schemas>
            </xsl:variable>
            
            <xsl:variable name="schema-in-context-1" 
select="sic:schema-in-context($schemas/schemas/xs:schema[1])" />
            
            <Test1>
                <xsl:sequence select="$schema-in-context-1" />
            </Test1>
            
            <xsl:variable name="schema-in-context-2" 
select="sic:schema-in-context($schemas/schemas/xs:schema[2], 
$schema-in-context-1)" />
            
            <Test2>
                <xsl:sequence select="$schema-in-context-2" />
            </Test2>
            
            <xsl:variable name="schema-in-context-3" 
select="sic:schema-in-context($schemas/schemas/xs:schema[3], 
$schema-in-context-2)" />
            
            <Test3>
                <xsl:sequence select="$schema-in-context-3" />
            </Test3>
            
        </Results> 
    </xsl:template>
    
</xsl:stylesheet>

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--