2015-05-12 66 views
0

我需要一些幫助。從XQuery到XHTML

我想寫一個XQuery,其輸出將是一個XHTML文件。問題是,「XHTML文檔必須具有XHTML DOCTYPE聲明」,我無法將DOCTYPE行放入我的XQuery文件中以生成有效的XHTML文件。

我可能誤解了一些東西,所以任何幫助表示讚賞。

更具體地說:

我有一個小的XQuery腳本:

for $book in doc("data.xml")//book 
     where $book/copycount = max(
      for $count in doc("data.xml")//book/copycount 
      return $count 
      ) 
     return (data($book/title)) 

而且我想生成解決此腳本顯示了返回的字符串有效的XHTML文件。

回答

1

如果您的XQuery處理器沒有序列化結果本身,您必須告訴我們更多關於您的平臺以及您如何使用結果的信息。

如果您的處理器將結果本身序列化爲1.0,那麼您必須告訴我們您使用哪一個,並查看其文檔中的依賴於實現的開關來執行此操作。

最後但並非最不重要的一點是,如果您使用XQuery 3.0並且您的處理器負責序列化,則可以使用以下內容來告訴它使用適當的DOCTYPE將輸出樹序列化爲XHTML(請參閱相關定義規格在http://w3.org/TR/xquery-30/#id-serializationhttp://w3.org/TR/xslt-xquery-serialization-30/#xhtml-output):

xquery version "3.0"; 

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; 
declare option output:method   "xhtml"; 
declare option output:doctype-public "-//W3C//DTD XHTML 1.0 Transitional//EN"; 
declare option output:doctype-system "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"; 

/some/query/here 
+0

謝謝。你能不能把我的腳本包含在其中(意思是舉一個例子,整個文件是怎麼樣的)?我嘗試過,但我的查詢不會返回任何東西(我想我搞砸了命名空間)。非常感激。 – Wanderer

+0

我編輯了上面的示例,包括XQuery版本以及放置原始查詢的位置。請注意,這僅在XQuery 3.0中可用。你使用什麼處理器? –

+0

我懂了。我使用了你包含的頭文件,我把我的查詢腳本聲明爲一個函數,並且在標籤中我只放了這個函數。像魅力一樣工作。謝謝您的幫助。 – Wanderer

-1

一個通用的方式來做到這一點是通過將它作爲文檔節點的文本子節點:

document { 
    text { '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' }, 
    xdmp:quote(
    **** your XQY **** 
) 
    (: or in eXist, util:serialize(), etc. :) 
} 

一些XQuery處理程序有這樣的事情選項標誌,所以你可能能夠使用,而不是,讓處理器爲你序列化它。

+0

可悲的輸出是: 「!< DOCTYPE HTML PUBLIC .....」 我不能逃脫@Wanderer這XQuery處理您使用的是<字符 – Wanderer

+0

? – wst

+1

試圖手工生成DOCTYPE是一個壞主意。 「特殊字符」(特別是'<')將被序列化器轉義(除非你正確地配置它不這樣做,但是,正確地配置它爲你輸出DOCTYPE要好得多)。 –