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
现在,如果我将价格表中的ID格式更改为专有数字
<?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
答案 0 :(得分:4)
xi:include元素有 以下属性:
HREF
适当后的值 逃逸(见4.1.1逃离href 属性值)已经执行, 导致URI引用或IRI 引用指定的位置 要包含的资源。 href 属性是可选的;的缺席 这个属性是一样的 指定href =“”,即 引用是指同一文件。如果 当href属性不存在时 parse =“xml”,xpointer属性 必须在场。的片段 不得使用标识符;其 外观是一个致命错误。一个值 这导致语法上的 应报告无效的URI或IRI 作为一个致命的错误,但有些 实现可能会找到它 区分这种情况是不切实际的 来自资源错误。
所以,“不得使用片段标识符;它们的外观是致命错误。”
解决方案:尝试省略href
属性并使用xpointer
属性。
但,请注意同一规范中的 following text :
对于完整的XInclude一致性,不支持[XPointer xpointer()Scheme]。 作者被告知使用xpointer()和其他XPointer方案而不是element()可能不是 所有符合要求的XInclude实现支持
最后, here is an example from the spec 使用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属性声明为类型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>