Pregunta

Frustrante problema con XInclude / XPointer aquí.

El objetivo es incluir las entradas de una lista de con formato XML precio de las entradas en otro documento.Tengo un documento con una lista de precios que se parece a esto:

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

El siguiente incluir falla

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

con

 element include: XInclude error : failed build URL

Ahora si puedo cambiar el formato de los identificadores en la lista de precios para ser exclusivamente numérico

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

y el uso de esta sin incluir los apóstrofos

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

de repente, todo funciona.Así que el problema parece estar relacionado con los apóstrofos, pero ¿cómo puedo conseguir alrededor de eso?

También, aquí está mi xmllint información de la versión:

 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
¿Fue útil?

Solución

A partir de la XInclude Especificación del W3C:

El xi:include elemento tiene la siguientes atributos:

href

Un valor que, tras las oportunas escape (ver 4.1.1 de Escape a href los valores de atributo se ha llevado a cabo, resultados en una referencia URI o un IRI de referencia de la especificación de la ubicación de el recurso a incluir.El href atributo es opcional;la ausencia de este atributo es el mismo que especificando href="", es decir, la la referencia es para el mismo documento.Si el atributo href está ausente cuando parse="xml", el xpointer atributo debe estar presente. Fragmento los identificadores no deben ser utilizados;su la apariencia es un error fatal. Un valor que se traduce en una sintácticamente URI no válido o IRI debe ser reportado como un error fatal, pero algunos implementaciones pueden encontrar poco práctico para distinguir este caso a partir de un recurso de error.

Así, "Identificadores de fragmento no debe ser utilizado;su apariencia es un error fatal."

Solución:Trate de omitir la href atributo y el uso de la xpointer atributo.

Sin embargo, ser conscientes de la texto siguiente de la misma especificación:

Apoyo para la [XPointer xpointer() Esquema] no es obligatoria para la plena XInclude conformidad.Los autores se recomienda que el uso de xpointer() y otros XPointer esquemas de elemento() podría no ser apoyado por todos conformes XInclude implementaciones

Finalmente, aquí es un ejemplo de la especificación de la utilización de XPointer fragmento de inclusión:

El ejemplo siguiente ilustra los resultados de la inclusión de fragmentos de otro documento XML.Asumir la URI 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 hace referencia a una DTD que declara la identificación de atributos como tipo de IDENTIFICACIÓN, y 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>

El infoset resultante de la resolución de inclusión en el presente documento es el mismo (excepto para el incluyen la historia y propiedades de idioma) que el del siguiente 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top