3

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
4

1 に答える 1

4

XInclude W3C仕様から

xi:include要素には次の属性があります。

href

適切なエスケープ(4.1.1 href属性値のエスケープを参照)が実行された後、含めるリソースの場所を指定するURI参照またはIRI参照になる値。href属性はオプションです。この属性がないことは、href = ""を指定することと同じです。つまり、同じドキュメントへの参照です。parse = "xml"のときにhref属性が存在しない場合は、xpointer属性が存在する必要があります。フラグメント識別子は使用しないでください。それらの外観は致命的なエラーです。構文的に無効なURIまたはIRIになる値は、致命的なエラーとして報告する必要がありますが、実装によっては、このケースをリソースエラーと区別することが実用的でない場合があります。

したがって、「フラグメント識別子は使用しないでください。それらの外観は致命的なエラーです。

解決策:属性を省略して、href属性を使用してみてくださいxpointer

ただし、同じ仕様の次のテキストに注意してください。

[XPointer xpointer()スキーム]のサポートは、XIncludeに完全に準拠するために必須ではありません。xpointer()およびelement()以外の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は、id属性をタイプIDとして宣言するDTDを参照し、以下を含みます。

<?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>
于 2010-11-19T21:25:42.070 に答える