You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-users@xalan.apache.org by Jason Winshell <jw...@bearriver.com> on 2002/01/07 17:20:16 UTC
external default ns problem
Hi folks,
I having a problem getting Xalan to match input which explicitly is
governed by a schema defined to be the default namespace.
test.xsd:
--------
<?xml version='1.0' encoding='UTF-8'?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
targetNamespace="http://junk.com/Test"
>
<xsd:element name="test">
<xsd:complexType>
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="this" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
input.xml
---------
<?xml version='1.0' encoding='UTF-8' standalone="no" ?>
<test
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xmlns= "http://junk.com/Test"
xsi:schemaLocation="http://junk.com/Test test.xsd"
>
<this>
thisdata
</this>
</test>
XSL:
transform.xsl
-------------
<?xml version='1.0' encoding='UTF-8' standalone="no" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>
<xsl:output method = "xml" indent = "yes" />
<!-- the root element is schema -->
<xsl:template match="/">
## root was matched
count this: <xsl:value-of select="count(//this)"/>
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="this" >
elem name=<xsl:value-of select="name()"/>
## this was matched
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
I've tried Xalan 1.2.2, 2.1.0, and 2.2.D14 all which produce
this result which does not match elements in the default
name space.
---------
<?xml version="1.0" encoding="UTF-8"?>
## root was matched
count this: 0
thisdata
------
The <this> element goes unmatched.
By replacing the use of:
xmlns= "http://junk.com/Test"
xsi:schemaLocation="http://junk.com/Test test.xsd"
With:
xsi:noNamespaceLocation="test.xsd"
Things work as expected, producing the desired result:
<?xml version="1.0" encoding="UTF-8"?>
## root was matched
count this: 1
elem name=this
## this was matched
thisdata
Interestingly if I Turbo XML on this same input.xml
(which uses Xalan for XSLT) I get the correct result.
The problem goes away if input.xml uses a non-default namespace for
all the elements to be matched (with associated namespace changes in
transform)
input.xml:
<?xml version='1.0' encoding='UTF-8' standalone="no" ?>
<foo:test
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xmlns:foo= "http://junk.com/Test"
xsi:schemaLocation="http://junk.com/Test test.xsd"
>
<foo:this>
thisdata
</foo:this>
</foo:test>
transform.xsl
<?xml version='1.0' encoding='UTF-8' standalone="no" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:foo="http://junk.com/Test"
>
<xsl:output method = "xml" indent = "yes" />
<!-- the root element is schema -->
<xsl:template match="/">
## root was matched
count this: <xsl:value-of select="count(//foo:this)"/>
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="foo:this" >
elem name=<xsl:value-of select="name()"/>
## this was matched
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
Why is Xalan not matching elements when the input document has a
default namespace that is explicitly declared (as opposed to using
noNameSpaceLocation)?
--
-------------------------------------------------------------------------
Jason Winshell, Principal Consulting Engineer jwinshell@bearriver.com
Bear River Associates, Inc. http://www.bearriver.com