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>
使用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
最佳答案
从XInclude W3C Spec开始:
xi:include元素具有
以下属性:
HREF
在适当的时候
转义(参见4.1.1转义
属性值)已执行,
导致uri引用或iri
指定位置的引用
要包含的资源。HREF
属性是可选的;缺少
此属性与
指定Href=”,即
引用的是同一个文档。如果
当
parse=“xml”,xpointer属性
必须在场。破片
不能使用标识符;它们
外观是一个致命的错误。一个值
结果在句法上
应报告无效的uri或iri
作为一个致命的错误,但是
实现可能会发现
区分这个案子不切实际
从资源错误。
因此,“不能使用片段标识符;它们的出现是一个致命的错误。”
解决方案:尝试省略href
属性并使用xpointer
属性。
但是,请注意来自同一规范的following text:
对于完全xinclude一致性,对[xpointer xpointer()方案]的支持不是必需的。
建议作者不要使用xpointer()和element()以外的其他xpointer方案
由所有一致的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,该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>
关于xml - 解决用撇号引起的@id值时无法解析XPointer URL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4225639/