Re: [xsl] How to compare two QName values in an XML Schema?

Subject: Re: [xsl] How to compare two QName values in an XML Schema?
From: Michael Kay <mike@xxxxxxxxxxxx>
Date: Fri, 08 Apr 2011 18:35:12 +0100
On 08/04/2011 17:00, Costello, Roger L. wrote:
Hi Folks,

Below is an XML Schema, containing two simpleTypes. The second one references the first.

I want an XPath expression that compares the second simpleType's reference to the name of the first simpleType:


/xs:schema/xs:simpleType[1]/@name eq /xs:schema/xs:simpleType[2]/xs:restriction/@base


That returns False. I want it to return True.

The @base attribute is defined as an xs:QName, but @name is not. You're going to have to tell it to build a QName by combining the local name in @name with the namespace URI in ../@targetNamespace. With a schema-aware XSLT processor, the best you can achieve is


/xs:schema/xs:simpleType[1]/QName(../@targetNamespace, @name)
  eq
/xs:schema/xs:simpleType[2]/xs:restriction/@base

However, running schema-aware code using the schema-for-schemas can be a little mindblowing (and processor-blowing)

Michael Kay
Saxonica



I figured the reason it's returning False is because it is comparing the string "elev:BostonAreaSurfaceElevation" against the string "EarthSurfaceElevation". Yes?

I want it to do a comparison of QNames, not strings. So I type-cast the values:


xs:QName(/xs:schema/xs:simpleType[1]/@name) eq xs:QName(/xs:schema/xs:simpleType[2]/xs:restriction/@base)


But that gave me this error:


Casting from xs:unTypedAtomic to xs:QName can never succeed.

Why?

What's the correct way to do the comparison?

---------------------------------------------------------
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema";
             targetNamespace="http://www.elevation.org";
             xmlns:elev="http://www.elevation.org";
             elementFormDefault="qualified">

     <xsd:simpleType name= "EarthSurfaceElevation">
         <xsd:restriction base="xsd:integer">
             <xsd:minInclusive value="-1290"/>
             <xsd:maxInclusive value="29035"/>
         </xsd:restriction>
     </xsd:simpleType>

     <xsd:simpleType name= "BostonAreaSurfaceElevation">
         <xsd:restriction base="elev:EarthSurfaceElevation">
             <xsd:minInclusive value="0"/>
             <xsd:maxInclusive value="120"/>
         </xsd:restriction>
     </xsd:simpleType>

</xsd:schema>
---------------------------------------------------------

/Roger

Current Thread