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