xsl-list
[Top] [All Lists]

Re: [xsl] XPath Best Practice: Getting the processor to detect misspelled tag names in XPath expressions [Was: Is an XPath processor responsible for catching misspelled tag names when there is an associated Schema?]

2008-02-22 10:03:47
If the XML Schema defines the following structure,
/Book/Author and not, /Book/Authr , then supplying the XPath
expression /Book/Authr to the XPath processor is not an error as per
XPath. It just returns an empty sequence.

As you rightly said, while using XPath expressions in some host
environment, for e.g., XSLT, we can leverage the Schema aware features
of XSLT (2.0) to detect wrong XPath expressions ...

On Fri, Feb 22, 2008 at 6:24 PM, Costello, Roger L. 
<costello(_at_)mitre(_dot_)org> wrote:
Hi Folks,

Below is a summary of our discussions.  Comments welcome.  /Roger

Consider this XML document:

<?xml version="1.0"?>
<Book>
   <Title>My Life and Times</Title>
   <Author>Paul McCartney</Author>
   <Date>1998</Date>
   <ISBN>1-56592-235-2</ISBN>
   <Publisher>McMillan Publishing</Publisher> </Book>

Here is an XPath expression to count the number of <Author> elements:

   count(/Book/Authr)

Notice that Author has been accidentally misspelled in the XPath
expression.

The XML document conforms to this XML Schema:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";
          elementFormDefault="qualified">
   <xs:element name="Book">
       <xs:complexType>
           <xs:sequence>
               <xs:element ref="Title" />
               <xs:element ref="Author"  minOccurs="0"
maxOccurs="unbounded" />
               <xs:element ref="Date" />
               <xs:element ref="ISBN" />
               <xs:element ref="Publisher" />
           </xs:sequence>
       </xs:complexType>
   </xs:element>
   <xs:element name="Title" type="xs:string"/>
   <xs:element name="Author" type="xs:string"/>
   <xs:element name="Date" type="xs:string"/>
   <xs:element name="ISBN" type="xs:string"/>
   <xs:element name="Publisher" type="xs:string"/> </xs:schema>

Note that it is particularly important to design the XPath in such a
way that the processor catches the misspelled tag name, since the XML
Schema declares the number of occurrences of the <Author> element to be
0-to-unbounded.  The XPath count function may return a result of 0,
which is a legitimate value and so the misspelling error may go
undetected for a long time.

It should be possible for the XPath processor to detect, by consulting
the XML Schema, that Authr is not a legal child of Book and generate an
error or warning.

And it is possible.  However, it cannot be accomplished entirely within
XPath; features from the host language must be utilized.

For example, if the host language is XSLT then first create a variable
for the <Book> element and use the XSLT variable declaration capability
to specify its type, using the "as" attribute:

   <xsl:variable name="bk" select="/Book" as="schema-element(Book)" />

Then use the variable in the XPath expression:

   count($bk/Authr)

Now the processor will generate an error or warning message.  SAXON
generates this warning: "The complex type of element Book does not
allow a child element named Authr"

Using features from the host language is not an ideal situation.  The
consequence of using host-language-specific features is that the XPath
is not portable: for each host language the XPath must be redesigned
using capabilities from the host language.



-- 
Regards,
Mukul Gandhi

--~------------------------------------------------------------------
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>
--~--