在处理包含撇号的@id值时,未解析XPointer URL

时间:2010-11-19 13:56:26

标签: xml xpath xpointer

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

1 个答案:

答案 0 :(得分:4)

来自XInclude W3C Spec

  

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>