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

Расстраивающая проблема с 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 ответ

Решение

Из спецификации XInclude W3C:

Элемент 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>
Другие вопросы по тегам