2012-12-05 26 views
1

我正在閱讀和測試XQuery,並且使用BaseX(www.basex.org)和saxon-HE 9.4.0.6N等測試工具。 對於以下簡單的XML文件 - 沒有連接到sample.xml中的模式:使用idref的XPath表達式

<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> 

在,如果我輸入下面的XPath表達式Basex_GUI://idref("abc")/.. 結果是:<itema x1="10" xidref="abc">testa</itema>

在BaseX_GUI如果我添加簡單的XQuery表達式:

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表達式只返回一個節點?我認爲的兩個...

在薩克森,通過使用下面的XQL文件:

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

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

或XQuery表達式,我通過運行命令query sample.xql得到相同的結果q2)我的撒克遜測試有什麼問題?

非常感謝您的幫助!

回答

2

基本上,idref()對DTD驗證很敏感 - 它可以識別DTD中聲明爲類型IDREF的屬性。

你沒有向我們展示你的DTD,更重要的是,你沒有展示如何提供查詢的輸入。有很多構建輸入的方法,其中屬性的「IDREF-ness」丟失 - 例如,通過DOM進行。即使在Saxon中使用doc()函數,輸入樹的構建方式也取決於很多因素,包括配置選項和URIResolver。

我看你使用的是.NET。當Saxon在.NET上使用Microsoft XML解析器時,它不知道哪些屬性是ID和IDREF,因此id()idref()函數不起作用(MS解析器根本不提供此信息)。因此,您需要使用Saxon產品附帶的JAXP解析器(Xerces)。我認爲這是目前的默認設置。

所以不是一個真正的答案,但希望有一些背景解釋了一些可能出錯的事情。

+0

沒有DTD ... sample.xml是在我讀了書中的一些章節後寫的。 – dag

+0

如果沒有DTD且沒有模式,那麼系統無法知道哪些屬性是IDREF屬性,因此idref()函數將永遠不會返回任何內容。 –

+0

如果我編寫自己的DTD,是否可以使用Saxon從命令行使用它(內部DTD或外部引用)? (例如查詢-useDTD:x sample.xql)。但在編程上,在.Net? DTD文件假設只是我需要的非常簡單 - 一些屬性要聲明爲IDREF類型。非常感謝你! – dag