XPointer URL n'est pas résolu lors de l'adressage d'apostrophe en lattes de @valeurs d'id

StackOverflow https://stackoverflow.com/questions/4225639

  •  26-09-2019
  •  | 
  •  

Question

Frustrant problème avec XInclude / XPointer ici.

Le but est d'inclure les entrées à partir d'une liste de format XML des prix des entrées dans un autre document.J'ai un document avec une liste de 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>

L'inclusion suivante échoue

 <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 de l'id dans la liste des prix pour ê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 cette comprennent sans les apostrophes

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

tout à coup, tout fonctionne.Donc le problème semble être lié à l'apostrophe, mais comment puis-je obtenir autour de qui?

Aussi, voici mon 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
Était-ce utile?

La solution

À partir de la XInclude Spec W3C:

Le xi:include élément a de la attributs suivants:

href

Une valeur qui, après de s'échapper (voir 4.1.1 s'Échapper de href les valeurs d'attribut) a été effectuée, résultats dans une référence URI ou un IRI référence de la spécification de l'emplacement de la ressource à inclure.Le href attribut est facultatif;l'absence de cet attribut est le même que la spécification href="", qui est, le il s'agit du même document.Si l'attribut href est absent au moment de parse="xml", le xpointer attribut doit être présent. Fragment les identifiants ne doivent pas être utilisés;leur l'apparence est une erreur fatale. Une valeur que les résultats d'un point de vue syntaxique URI non valide ou IRI doit être signalé comme une erreur fatale, mais certains les implémentations peuvent trouver impossible de distinguer ce cas à partir d'une ressource d'erreur.

Donc, "Des identificateurs de Fragment ne doit pas être utilisé;leur apparence est une erreur fatale."

Solution:Essayez d'omettre le href attribut et l'utilisation de la xpointer attribut.

Cependant, être conscient de la texte suivant de la même spécification:

Soutien pour le [XPointer xpointer() Schéma d'] n'est pas obligatoire de plein XInclude conformité.Les auteurs sont informés que l'utilisation de xpointer() et d'autres XPointer régimes que l'élément() peut ne pas être pris en charge par tous conforme XInclude implémentations

Enfin, voici un exemple de la spec de l'aide XPointer fragment d'inclusion:

L'exemple suivant illustre les résultats de l'inclusion des fragments d'un autre document XML.Assumer la 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>

price-list.xml fait référence à une DTD qui déclare les id des 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>

Les informations résultant de la résolution des inclusions sur le présent document est le même (sauf pour le inclure l'histoire et la langue des propriétés) que le 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top