Frustrating issue with XInclude / XPointer here.
The aim is to include entries from a list of XML-formatted price-entries into another document. I have a document with a list of prices that looks like this:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE preise [
<!ELEMENT preise (preis+)>
<!ELEMENT preis (#PCDATA)>
<!ATTLIST preis id ID #REQUIRED>
]>
<preise>
<preis id="a0">./.</preis>
<preis id='foo100'>136,10</preis>
<preis id='foo101'>163,32</preis>
</preise>
The following include fails
<xi:include href="../listen/preise.xml#xpointer(/preise/preis[@id='foo100']/text())" />
with
element include: XInclude error : failed build URL
Now if I change the format of the ids in the price-list to be exclusively numerical
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE preise [
<!ELEMENT preise (preis+)>
<!ELEMENT preis (#PCDATA)>
<!ATTLIST preis id ID #REQUIRED>
]>
<preise>
<preis id="a0">./.</preis>
<preis id='100'>136,10</preis>
<preis id='101'>163,32</preis>
</preise>
and use this include without the apostrophes
<xi:include href="../listen/preise.xml#xpointer(/preise/preis[@id=100]/text())" />
suddenly everything works. So the issue seems to be related to the apostrophes, but how do I get around that?
Also, here's my xmllint version info:
xmllint: using libxml version 20706
compiled with: Threads Tree Output Push Reader Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy C14N Catalog XPath XPointer XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas Schematron Modules Debug Zlib
From the XInclude W3C Spec:
The xi:include element has the following attributes:
href
A value which, after appropriate escaping (see 4.1.1 Escaping of href attribute values) has been performed, results in a URI reference or an IRI reference specifying the location of the resource to include. The href attribute is optional; the absence of this attribute is the same as specifying href="", that is, the reference is to the same document. If the href attribute is absent when parse="xml", the xpointer attribute must be present. Fragment identifiers must not be used; their appearance is a fatal error. A value that results in a syntactically invalid URI or IRI should be reported as a fatal error, but some implementations may find it impractical to distinguish this case from a resource error.
So, "Fragment identifiers must not be used; their appearance is a fatal error."
Solution: Try to omit the href
attribute and to use the xpointer
attribute.
However, be aware of the following text from the same spec:
Support for the [XPointer xpointer() Scheme] is not mandatory for full XInclude conformance. Authors are advised that use of xpointer() and other XPointer schemes than element() might not be supported by all conformant XInclude implementations
Finally, here is an example from the spec of using XPointer fragment inclusion:
The following illustrates the results of including fragments of another XML document. Assume the base URI of the document is http://www.example.com/JoeSmithQuote.xml.
<?xml version='1.0'?>
<price-quote xmlns:xi="http://www.w3.org/2001/XInclude">
<prepared-for>Joe Smith</prepared-for>
<good-through>20040930</good-through>
<xi:include href="price-list.xml" xpointer="w002-description"/>
<volume>40</volume>
<xi:include href="price-list.xml" xpointer="element(w002-prices/2)"/>
</price-quote>
price-list.xml references a DTD which declares the id attributes as type ID, and contains:
<?xml version='1.0'?>
<!DOCTYPE price-list SYSTEM "price-list.dtd">
<price-list xml:lang="en-us">
<item id="w001">
<description id="w001-description">
<p>Normal Widget</p>
</description>
<prices id="w001-prices">
<price currency="USD" volume="1+">39.95</price>
<price currency="USD" volume="10+">34.95</price>
<price currency="USD" volume="100+">29.95</price>
</prices>
</item>
<item id="w002">
<description id="w002-description">
<p>Super-sized widget with bells <i>and</i> whistles.</p>
</description>
<prices id="w002-prices">
<price currency="USD" volume="1+">59.95</price>
<price currency="USD" volume="10+">54.95</price>
<price currency="USD" volume="100+">49.95</price>
</prices>
</item>
</price-list>
The infoset resulting from resolving inclusions on this document is the same (except for the include history and language properties) as that of the following document:
<?xml version='1.0'?>
<price-quote xmlns:xi="http://www.w3.org/2001/XInclude">
<prepared-for>Joe Smith</prepared-for>
<good-through>20040930</good-through>
<description id="w002-description" xml:lang="en-us"
xml:base="http://www.example.com/price-list.xml">
<p>Super-sized widget with bells <i>and</i> whistles.</p>
</description>
<volume>40</volume>
<price currency="USD" volume="10+" xml:lang="en-us"
xml:base="http://www.example.com/price-list.xml">54.95</price>
</price-quote>