2

私はXQueryについて読んでテストしており、BaseX(www.basex.org)とsaxon-HE 9.4.0.6Nを使用するテストツールと同様です。次の単純な XML ファイルの場合 - sample.xml にスキーマが添付されていません。

    <rootab>
     <l1>
       <items p="a">
         <itema x1="10" id="abc">testa</itema>
         <itemb x1="10" id="dfe">testb</itemb>
         <itemc x1="10" id="jgh">testc</itemc>  
       </items>
     </l1> 
     <l2>
         <items p="b">
           <itema x1="10" xidref="abc">testa</itema>
           <itemc x1="10" xidref="jgh">testc</itemc>  
           <itemd x1="10" xidref="abc">testA101</itemd>  
           <iteme x1="10" xidref="jgh">testB202</iteme>  
         </items>
     </l2> 
</rootab>

Basex_GUI で次の XPath 式を入力すると//idref("abc")/.. 、結果は 次のようになります。<itema x1="10" xidref="abc">testa</itema>

単純な XQuery 式を追加すると、BaseX_GUI に次のようになります。

for $x in doc('sample.xml')//idref("abc")/.. 
    return <aaa>{$x}</aaa>

結果は次のとおりです。

<aaa>
  <itema x1="10" xidref="abc">testa</itema>
</aaa>
<aaa>
  <itemd x1="10" xidref="abc">testA101</itemd>
 </aaa>

q1) XPath 式が 1 つのノードのみを返したのはなぜですか? 2つ期待してたのに…

Saxon では、次の xql ファイルを使用します。

    <test>
    {
    doc('sample.xml')//idref("abc")/..
    }
   </test>

または XQuery 式、次のコマンドを実行して同じ結果を受け取りますquery sample.xql

<?xml version="1.0" encoding="UTF-8"?><test/>

q2) サクソンテストのどこが悪いのですか?

よろしくお願いします。

4

1 に答える 1

3

基本的に、idref()DTD 検証に敏感です。DTD で型IDREFとして宣言された属性を認識します。

あなたは私たちにあなたの DTD を示していません。さらに重要なことに、クエリへの入力がどのように提供されるかを示していません。属性の「IDREF 性」が失われた入力を構築する方法は多数あります。たとえば、DOM を経由する方法です。Saxon で関数を使用する場合でもdoc()、入力ツリーの構築方法は、構成オプションや URIResolver などの多くの要因に依存します。

.NET を使用しているようです。Saxon が .NET で Microsoft XML パーサーを使用する場合、どの属性が ID および IDREF であるかがわからないため、関数id()idref()関数は機能しません (MS パーサーは単にこの情報を提供しません)。したがって、Saxon 製品に付属の JAXP パーサー (Xerces) を使用する必要があります。最近はこれがデフォルトだと思います。

したがって、実際には答えではありませんが、うまくいかない可能性のあることのいくつかを説明する背景があれば幸いです.

于 2012-12-05T08:41:16.290 に答える