URL-адрес XPointer не разрешен при обращении к значениям @id, заключенным в апостроф - PullRequest
3 голосов
/ 19 ноября 2010

Расстраивает проблема с XInclude / XPointer здесь.

Целью является включение записей из списка ценовых записей в формате XML в другой документ. У меня есть документ со списком цен, который выглядит следующим образом:

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

Не удалось включить следующее

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

с

 element include: XInclude error : failed build URL

Теперь, если я изменю формат идентификаторов в прайс-листе на исключительно числовой

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

и используйте это без апострофов

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

вдруг все работает. Так что проблема, похоже, связана с апострофами, но как мне обойти это?

Также, вот моя информация о версии xmllint:

 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

1 Ответ

4 голосов
/ 20 ноября 2010

Из XInclude W3C Spec :

Элемент xi: include имеет следующие атрибуты:

href

Значение, которое после соответствующего экранирования (см. 4.1.1 Экранирование значений атрибута href) приводит к ссылке URI или ссылке IRI, указывающей местоположение ресурса для включения.Атрибут href является необязательным;Отсутствие этого атрибута аналогично указанию href = "", то есть ссылка на тот же документ.Если атрибут href отсутствует, когда parse = "xml", атрибут xpointer должен присутствовать. Идентификаторы фрагментов не должны использоваться;их появление является фатальной ошибкой. Значение, приводящее к синтаксически недопустимому URI или IRI, следует указывать как фатальную ошибку, но некоторые реализации могут счесть нецелесообразным отличать этот случай от ошибки ресурса.

Итак, " Идентификаторы фрагментов не должны использоваться; их появление является фатальной ошибкой. "

Решение : Попробуйте опустить атрибут hrefи использовать атрибут xpointer.

Однако , имейте в виду следующий текст из той же спецификации:

Поддержка [Схема XPointer xpointer ()] не является обязательной для полного соответствия XInclude.Авторам рекомендуется, чтобы использование xpointer () и других схем XPointer, кроме element (), могло не поддерживаться всеми совместимыми реализациями XInclude

Наконец, - вот пример из спецификации использования включения фрагмента XPointer:

Ниже показаны результаты включения фрагментов другого XML-документа.Предположим, что базовый URI документа равен 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 ссылается на DTD, который объявляет атрибуты id как идентификатор типа и содержит:

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

Информационный набор, полученный при разрешении включений в этом документе, такой же (за исключением истории включения и свойств языка), что и следующий документ:

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