- From: Saul Farber <saul@syncline.com>
- Date: 05 Nov 2001 12:16:25 -0500
- To: xmlschema-dev@w3c.org
- Message-Id: <1004980585.3200.48.camel@saul>
Hello all, I'm running into the following problem while creating a schema that uses key and keyref elements. take the following xml document (extraneous detail removed): <?xml version="1.0"?> <document xmlns="http://me.com/documentns"> <!-- define some unique objects --> <unq:uniqueObjectList xmlns:unq="http://me.com/listns"> <unq:uniqueObject id="1"> <unq:info>This object is a blue ball</unq:info> </unq:uniqueObject> <unq:uniqueObject id="2"> <unq:info>This object is a blue iMac</unq:info> </unq:uniqueObject> </unq:uniqueObjectList> <!-- now reference them in some groups --> <gr:groupList xmlns:gr="http://me.com/groupns"> <gr:group name="bluethings"> <gr:desc>Objects that are blue</gr:desc> <object id="1"/> <object id="2"/> </gr:group> <gr:group name="electricthings"> <gr:desc>Objects that are electric</gr:desc> <object id="2"/> </gr:group> <gr:group name="roundthings"> <gr:desc>Objects that are round</gr:desc> <object id="1"/> </gr:group> </gr:groupList> </document> Whew! So here's the problem: As is probably obvious from the example, I'd like to keyref the <object id="x" /> tags into the <unq:uniqueObject id="1"> <unq:info>This object is a blue ball</unq:info> </unq:uniqueObject> blocks, via the "id" attribute in each case. However, I'm unable to assume anything about the prefix abbreviation that will be associated with the namespaces "http://me.com/listns" and "http://me.com/groupns"...because this xml fragment is actually a message passed to me (therefore I don't get to assume that 'gr' is the prefix associated with "http://me.com/groupns"). So I face the question of what to put into the xpath attribute of the key and keyref schema-elements (which must obviously be children of the <document> schema-description). My attempts were: 1) Use the local-name() function of Xpath. like this: <xs:element name="document"> <xs:complexType> ... <!-- insert schema-description of the children of <document> --> </xs:complexType> <xs:key name="layerDefinitionKey"> <xs:selector xpath="*[local-name()='uniqueObjectList']/*[local-name()='uniqueObject']"/> <xs:field xpath="@id"/> </xs:key> <xs:keyref name="thisStringDoesntMatter" refer="tns:layerDefinitionKey"> <xs:selector xpath="*[local-name()='groupList']/*//*[local-name()='group']"/> <xs:field xpath="@id"/> </xs:keyref> However, Xerces barfs on the '[' character in the xpath attribute...and besides, this isn't really a good solution, I don't think. 2) declare the namespace-prefix that I want right next to the xpath element <xs:element name="document"> <xs:complexType> ... <!-- insert schema-description of the children of <document> --> </xs:complexType> <xs:key name="layerDefinitionKey"> <xs:selector xpath="list:uniqueObjectList/list:uniqueObject" xmlns:list="http://me.com/listns" /> <xs:field xpath="@id"/> </xs:key> <xs:keyref name="thisStringDoesntMatter" refer="tns:layerDefinitionKey"> <xs:selector xpath="gr:groupList/*//gr:group" xmlns:gr="http://me.com/groupns" /> <xs:field xpath="@id"/> </xs:keyref> However I've had no luck this way, either! It seems to me that this is simply an instance of a larger problem...how to deal with potentially unknown namespace prefixes. In standard xslt transformations I can usually get away with the [local-name() = 'foo'] trick...but not in this case. Is there a real solution to this, or is this a fundamental problem with XML-Schema? thanks! saul -- Syncline, Inc. 373 Washington St. Boston, MA 02108 617-986-1000 (x248) www.syncline.com -- Informing the Enterprise www.mapciti.com -- It's Your Town on the Web
Received on Monday, 5 November 2001 12:12:56 UTC