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 ответ
Элемент 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>