RE: [xsl] Finding the ID attribute of an XPath from XMLSchema

Subject: RE: [xsl] Finding the ID attribute of an XPath from XMLSchema
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Sun, 22 Jul 2007 11:01:37 +0100
XQuery is actually off-topic for this list, but I didn't notice that when
you started the thread because your subject line says XPath.

With Saxon-SA 8.9.0.3, 

(1) it reports the error "function is in a reserved namespace". Function
names must be in your own namespace.

(2) When I fix that (prefix the function name with "local:"), it works fine.
I think there is a bug in your XQuery processor.

Michael Kay 

> -----Original Message-----
> From: v vijith [mailto:vvijith@xxxxxxxxx] 
> Sent: 22 July 2007 03:42
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Finding the ID attribute of an XPath from XMLSchema
> 
> Mike
> Based on the syntax above, I wrote the code and gives an 
> error, context document undefined.
> 
> declare function id-from-element ( $element as element()? )  
> as xs:string? {
>        data(($element/@*[id(.) is ..])[1])  } ;
> 
> let $dm := doc("/repository/content/3001") let $ee:= 
> id-from-element($dm//figure/picture[1])
> return
>    <net>
>      {$ee}
>    </net>
> 
> It gives me an error "context document undefined".
> 
> the XML is having the struct
> 
> <?xml version="1.0" encoding="UTF-8"?>
> 
> <sample1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
> xsi:noNamespaceSchemaLocation="sample1.xsd">
> 	<data>Copyright MyCompany 2007</data>
> 	<figure>
> 		<picture no="IMAGE-1"/>
> 		<picture no="IMAGE-2"/>
> 		<picture no="IMAGE-3"/>
> 	</figure>
> </sample1>
> 
> XSD is
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";
> elementFormDefault="qualified">
> 	<xs:element name="sample1">
> 		<xs:complexType>
> 			<xs:sequence>
> 				<xs:element ref="data"/>
> 				<xs:element ref="figure"/>
> 			</xs:sequence>
> 		</xs:complexType>
> 	</xs:element>
> 	<xs:element name="data" type="xs:string"/>
> 	<xs:element name="figure">
> 		<xs:complexType>
> 			<xs:sequence>
> 				<xs:element 
> maxOccurs="unbounded" ref="picture"/>
> 			</xs:sequence>
> 		</xs:complexType>
> 		</xs:element>
> 	<xs:element name="picture">
> 		<xs:complexType>
> 			<xs:attribute name="no" use="required" 
> type="xs:ID"/>
> 		</xs:complexType>
> 	</xs:element>
> </xs:schema>
> 
> 
> Thanks
> Vijith
> 
> On 7/21/07, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> > Given a node $n, you can find the value of its ID attribute 
> if it has 
> > one using
> >
> > $n/@*[id(.) is $n]
> >
> > Michael Kay
> > http://www.saxonica.com/
> >
> >
> > > -----Original Message-----
> > > From: v vijith [mailto:vvijith@xxxxxxxxx]
> > > Sent: 21 July 2007 19:16
> > > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > > Subject: Re: [xsl] Finding the ID attribute of an XPath from 
> > > XMLSchema
> > >
> > > Below is a snippet from the XMLSchema
> > >
> > > <xs:complexType name="nameType">
> > >               <xs:sequence>
> > >                       <xs:element minOccurs="0" ref="desig"/>
> > >               </xs:sequence>
> > >               <xs:attribute ref="dest" use="required"/>
> > >               <xs:attribute ref="id"/>
> > >               <xs:attribute ref="garageid"/>
> > >               <xs:attributeGroup ref="xlink:XLINKATT1"/>
> > >       </xs:complexType>
> > > <xs:attribute name="id" type="xs:ID"/>
> > >
> > > this means that in the XML, the nameType node can be 
> identified by 
> > > the id attribute as xs:attribute name=id is mapped to XS:ID.
> > >
> > > Likewise there can be many nodes in the XML that has ID 
> associated 
> > > to it.
> > >
> > > <xml>
> > > <root>
> > > <somenode>
> > > <nameType id="2" attrib2="34">text</nameType> <nameType id="3" 
> > > attrib2="34">text</nameType> <nameType id="4"
> > > attrib2="34">text</nameType> </somenode> <anothernode 
> attrib5="55"/> 
> > > </root>
> > >
> > >
> > > In the XML, I perform some kind of XQuery and I get the output as 
> > > root/somenode/anothernode/nameType.
> > > Once I get this node, I should be able to find if there is an ID 
> > > attribute defined for this node in the XSD.
> > > In the above case, the id attribute in the nameType tag is the 
> > > attribute as per the XML Schema.
> > >
> > > So I need the output as id for the xpath 
> > > root/somenode/anothernode/nameType
> > >
> > > Hope I have explained it better!
> > >
> > > Well what I thought was this way as a solution 1. Parse the 
> > > XMLSchema 2. Make a map of XPath as key and the id as attribute.
> > > 3. Once I get the xpath from xquery, check the map to 
> find the id 4. 
> > > But parsing XMLSchema and mapping is not that simple either
> > >
> > > Thanks
> > > Vijith
> > >
> > > On 7/21/07, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> > > > > I have an XML which is associated to an XMLSchema. Once I
> > > perform an
> > > > > XQuery on the XML I get a selected set of XPaths (Im
> > > using our own
> > > > > functions).
> > > > >
> > > > > For each XPath I need to know what is the ID attribute
> > > for the XPath.
> > > > > I know that in XMLSchema there is an XS:ID Attribute. I
> > > would like
> > > > > to know if there is a way to find the ID associated from the 
> > > > > XMLSchema for an XPath in the XML.
> > > > >
> > > > > Did I confuse everyone?
> > > >
> > > > You certainly confused me. Show us your source document 
> and tell 
> > > > us what you want your output to look like.
> > > >
> > > > Michael Kay
> > > > http://www.saxonica.com/

Current Thread