2010-11-19 25 views
2

Problème frustrant avec XInclude/XPointer ici.L'URL XPointer n'est pas résolue lors de l'adressage des valeurs @id encapsulées dans un apostrophe

L'objectif est d'inclure des entrées d'une liste d'entrées de prix au format XML dans un autre document. J'ai un document avec une liste des prix qui ressemble à ceci:

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

Voici incluent tombe en panne

<xi:include href="../listen/preise.xml#xpointer(/preise/preis[@id='foo100']/text())" /> 

avec

element include: XInclude error : failed build URL 

Maintenant, si je change le format des ids dans la liste de prix à être exclusivement numérique

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

et utiliser ce sans inclure les apostrophes

<xi:include href="../listen/preise.xml#xpointer(/preise/preis[@id=100]/text())" /> 

soudainement tout fonctionne. Donc, la question semble être liée aux apostrophes, mais comment puis-je contourner cela?

Aussi, voici ma version xmllint 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 
+0

Bonne question, +1. Voir ma réponse pour une explication et une solution proposée. –

Répondre

3

De l'XInclude W3C Spec:

L'élément xi: include a les attributs suivants:

href

Une valeur qui ch, après approprié échapper (voir 4.1.1 Échapper de href valeurs d'attribut) a été réalisée, résultats dans une référence URI ou une référence IRI spécifiant l'emplacement de la ressource inclure. L'attribut href est facultatif; l'absence de cet attribut est le même que en spécifiant href = "", c.-à-d. que la référence correspond au même document. Si l'attribut href est absent lorsque parse = "xml", l'attribut xpointer doit être présent. Fragment Les identifiants ne doivent pas être utilisés; leur apparence est une erreur fatale. Une valeur qui se traduit par une URI syntaxiquement invalide ou IRI doit être signalé comme une erreur fatale, mais certains implémentations peuvent trouver impossible de distinguer ce cas d'une erreur de ressource.

Ainsi, « identificateurs de fragments ne doivent pas être utilisés, leur apparence est une erreur fatale. »

Solution: Essayez d'omettre l'attribut href et d'utiliser l'attribut xpointer.

Cependant, être au courant de la following text de la même spécification:

Appui à la [XPointer xpointer() Scheme] n'est pas obligatoire pour la conformité XInclude complète. Les auteurs sont priés de noter que l'utilisation de xpointer() et d'autres systèmes XPointer que l'élément() pourrait ne pas être pris en charge par toutes les implémentations conformes XInclude

Enfin, here is an example from the spec d'utiliser l'inclusion du fragment XPointer:

La figure suivante illustre les résultats de l'inclusion de fragments d'un autre document XML. Supposons que l'adresse URI de base du document est 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> 

prix list.xml fait référence à une DTD qui déclare l'ID attributs de type ID et contient:

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

Le infoset résultant de la résolution des inclusions sur ce le document est le même (à l'exception de inclure l'historique et les propriétés de langue) comme celui du document suivant:

<?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> 
+1

Cette réponse mérite certainement plus d'un +1 –

+0

Merci pour votre aide, Dimitre! – marcoliver