2011-04-21 48 views
1

在我的XQuery中,我有存儲在變量$ d XML節點,如:添加文檔類型指令的XML節點的XQuery

<topic id="IL27TRM409WedNov1919274820081"> 
<title>Access Switch Failure</title> 
<body> 
    and Reacting</i> feature of the <i>SMSC User Guide</i>.</p> 
</body> 
</topic> 

我的問題是現在,因爲我需要添加三個處理指令包括上面文檔頂部的DocType聲明,目前結果文檔只是一個純XML節點。所以基本上我想添加以下三行:

<?xml version="1.0" encoding="UTF-8"?> 
<?exist-serialize indent="no" output-doctype="yes"?> 
<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN" "task.dtd"> 

頂部。我試圖使用concat()$d,但失敗了。我想知道這種顯式的XML內容操作在XQuery中是否可行,否則我認爲我必須對XSLT進行更改才能生成帶有處理指令的$d

+2

你的第一行是一個XML聲明,第二行是一個處理指令,第三行是一個DOCTYPE聲明。三個中只有一個是處理指令。 – 2011-04-21 22:57:37

+0

@邁克爾:這是否表明第一和第三行可以更直接地放? – Kevin 2011-04-22 14:44:15

+0

不,相反。 XQuery 1.0有用於生成處理指令的語法。它沒有生成XML聲明或DOCTYPE聲明的語法。 – 2011-04-22 22:28:24

回答

2

要輸出的XML聲明和DOCTYPE聲明,您需要設置影響方式查詢的結果是序列化的參數。你這樣做的方式取決於你使用的XQuery處理器。

要輸出處理指令,請在查詢體中使用文字處理指令。

+0

+1更正XQuery答案。 – 2011-04-22 01:02:24

+0

你有一個示例頁面嗎? – Kevin 2011-04-22 14:39:45

1

你應該使用處理指令使用XSL輸出,像沿着:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" 
    doctype-public="-//OASIS//DTD DITA Task//EN" 
    doctype-system="task.dtd"/> 

    <xsl:template match="/"> 
     <xsl:processing-instruction name="exist-serialize">indent="no" output-doctype="yes" 
     </xsl:processing-instruction> 

     <xsl:apply-templates /> 
    </xsl:template> 
    [...] 
</xsl:stylesheet> 
+0

,這有所幫助。但是由於我有兩種模板匹配,另一種匹配Topic,那麼doctype-system應該是「topic.dtd」,所以我不能把它做成全局的「task.dtd」,你有什麼建議嗎? ? – Kevin 2011-04-21 20:42:50

+0

我真的不明白...你想讓這個xslt在不同的根標籤下使用xmls,並且根據這些標籤行爲不同? – rekaszeru 2011-04-21 20:48:08

+0

你可能想看看[這篇文章](http://www.scriptorium.com/2009/12/2469/)關於添加不同的DTD來輸出基於根節點的xmls。 – rekaszeru 2011-04-21 21:11:28