XPointer URL non viene risolto quando si affrontano apostrofo racchiusi @i valori di id

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

  •  26-09-2019
  •  | 
  •  

Domanda

Frustrante problema con XInclude / XPointer qui.

L'obiettivo è quello di includere le voci da un elenco di file XML di prezzo-voci in un altro documento.Ho un documento con un elenco di prezzi che assomiglia a questo:

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

Il seguente includere non riesce

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

con

 element include: XInclude error : failed build URL

Ora se cambio il formato dell'id nel prezzo-list per essere esclusivamente numerico

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

e uso questo includono, senza gli apostrofi

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

improvvisamente tutto funziona.Quindi il problema sembra essere collegato con gli apostrofi, ma come faccio a ottenere intorno a questo?

Inoltre, qui è il mio xmllint informazioni di versione:

 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
È stato utile?

Soluzione

Dal XInclude W3C Spec:

Xi:include elemento ha la seguenti attributi:

href

Un valore che, dopo un adeguato la fuga (vedi 4.1.1 Fuga di href i valori di attributo) è stato eseguito, risultati in un riferimento URI o IRI riferimento specificare la posizione di la risorsa, a includere.Href l'attributo è opzionale;l'assenza di questo attributo è la stessa specificando href="" che è la il riferimento è al documento stesso.Se l'attributo href è assente quando parse="xml", l'attributo di xpointer deve essere presente. Frammento identificatori non deve essere utilizzato;loro l'aspetto è un errore fatale. Un valore che si traduce in un sintatticamente URI non valido o IRI deve essere segnalato un errore fatale, ma alcuni le implementazioni possono trovare poco pratico per distinguere questo caso da un errore di risorsa.

Così, "Identificatori di frammento non deve essere utilizzato;il loro aspetto è un errore fatale."

Soluzione:Provare ad omettere la href attributo e di utilizzare il xpointer attributo.

Tuttavia, essere consapevole delle di seguito il testo dalla stessa spec:

Il supporto per il [XPointer xpointer() Schema] non è obbligatorio per la piena XInclude di conformità.Gli autori sono pregati di notare che l'uso di xpointer() e altri XPointer schemi di elemento() potrebbe non essere supportato da tutti conformi XInclude implementazioni

Infine, qui è un esempio dalla spec di utilizzo di XPointer frammento di inclusione:

Il seguente illustra i risultati dell'tra cui frammenti di un altro documento XML.Assumere il URI di base del documento è 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 fa riferimento a una DTD che dichiara l'id attributi di tipo ID, e contiene:

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

Infoset derivanti dalla risoluzione delle inclusioni in questo documento è lo stesso (tranne che per il includono la storia e la proprietà della lingua) come quella del seguente documento:

<?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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top