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

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

  •  26-09-2019
  •  | 
  •  

Вопрос

Досадная проблема с 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>

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

 <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
Это было полезно?

Решение

Из самого Включить Спецификацию 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 схемы, чем элемент() не может быть поддерживаются все совместимые 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 как type 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top