2015-05-12 41 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要好得多)。 –