XPointer URL não for resolvido quando endereçamento apóstrofo-envolto @identificação de valores

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

  •  26-09-2019
  •  | 
  •  

Pergunta

Frustrante problema com XInclude / XPointer aqui.

O objetivo é incluir entradas a partir de uma lista de formatados em XML preço-entradas em outro documento.Eu tenho um documento com uma lista de preços que se parece com isso:

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

A seguir incluem falha

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

com

 element include: XInclude error : failed build URL

Agora, se eu alterar o formato de ids no preço de lista a 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>

e usar isso inclui, sem o apóstrofo

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

de repente, tudo funciona.Assim, o problema parece estar relacionado com os apóstrofos, mas como faço isso?

Também, aqui está o meu xmllint informações de versão:

 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
Foi útil?

Solução

Do XInclude W3C Spec:

O xi:elemento de inclusão tem o seguintes atributos:

href

Um valor que, após adequada saída (ver 4.1.1 Escapar dos href valores de atributo) foi executada, resultados em um URI de referência ou um IRI de referência, especificando o local de o recurso de incluir.A href atributo é opcional;a ausência de este atributo é o mesmo especificando href="", isto é, o a referência é ao mesmo documento.Se o atributo href é ausente quando analisar="xml", o xpointer atributo deve estar presente. Fragmento de identificadores não deve ser utilizado;seus a aparência é um erro fatal. Um valor que resulta em uma sintaticamente URI inválido ou IRI deverá ser comunicado como um erro fatal, mas alguns implementações podem encontrá-lo impraticável distinguir este caso a partir de um recurso de erro.

Assim, "Identificadores de fragmento não deve ser utilizado;sua aparência é um erro fatal."

Solução:Tenta omitir o href atributo e usar o xpointer atributo.

No entanto, estar ciente de que o seguinte texto da mesma especificação:

Suporte para o [XPointer xpointer() Esquema] não é obrigatória para a completa XInclude de conformidade.Os autores são informados de que o uso de xpointer() e outras XPointer esquemas de elemento() não pode ser suportado por todos os conformes XInclude implementações

Finalmente, aqui está um exemplo de especificação de usar o XPointer fragmento de inclusão:

O seguinte ilustra os resultados, incluindo fragmentos de outro documento XML.Suponha que o URI base do 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 faz referência a um DTD, que declara a identificação de atributos do tipo ID, e contém:

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

O infoset resultantes da resolução de inclusões neste documento é o mesmo (exceto para o incluir a história e a linguagem de propriedades) como o seguinte 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top