XPointer URL não for resolvido quando endereçamento apóstrofo-envolto @identificação de valores
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
Solução
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>