2013-09-26 65 views
0

我正在處理一些XSLT轉換。這些轉換必須以自動化的方式應用於數以千計的XML文檔。結果文件應輸出到目標目錄。如何使XSLT有條件地輸出一個沒有DOCTYPE的空白文件?

請注意,某些轉換會生成XML,而有些轉換會生成純文本。

我有一個新的要求,即當輸入XML包含某些值時,某些XSLT轉換應該不會產生任何輸出,也不應寫入任何文件。

我在.net中處理XSLT的輸出,所以對於產生文本的XSLT,我只是簡單地檢查結果輸出是空白還是隻有空白;在這種情況下,我不寫文件,而且一切都很完美。

問題是當我嘗試從XSLT能產生XML承認空白輸出,因爲即使我指定什麼應該輸出在我xsl:template塊,輸出將包含一個XML文檔類型<?xml version="1.0" encoding="UTF-8"?>即使文檔是另有空白。

問題的一個解決方案是讓我的.net代碼過濾掉只包含XML文檔類型的文檔,但我不確定最好的方法是什麼。到目前爲止,我已經嘗試和xml.Trim().StartsWith("<?xml") && xml.Trim().EndsWith("?>"),但我不知道那是多麼的防彈。

這可能會更好,如果我可以以某種方式使我的XSLT輸出doctype僅當有數據要輸出。我試圖將<xsl:output>節點放在<xsl:if>節點內,但這不起作用。

什麼是獲得我需要的結果的好方法?

+0

如果您的客戶端輸出一些特定的XML,您的程序檢查是否意味着輸出應爲空白,該怎麼辦?這樣他們可以修改XSLT並獲得空白輸出,如果我理解 – Alan

回答

0

<?xml version="1.0" encoding="UTF-8"?>不是「DOCTYPE」。這是一個XML聲明:http://www.w3.org/TR/xml/#sec-prolog-dtd

如果你想省略XML聲明,在樣式表中使用

<xsl:output omit-xml-declaration = "yes"/> 

。它適用於XSLT 1.0和2.0。參考文獻:

請注意,<xsl:output>是樣式表模塊中的頂級元素。正如您已經注意到的那樣,它不能放在<xsl:if>中。有關相關討論,請參見Condition <xsl:output> in XSLT 1.0?

在XML文檔中有一個XML聲明是一個好習慣,但它不是強制性的。所以純粹的XSLT選項總是省略XML聲明。

+0

這看起來很有趣,但我在我的問題中提到,我不能在''內部放置''。我需要有條件地省略聲明。 –

1

我有一個新的要求,即當輸入XML包含某些值,某些XSLT轉換應該不惜一切沒有產生輸出,沒有文件應該被寫入。

我會做的是有條件地執行轉換本身。運行轉換之前檢查XML文件。如果輸入表明不應該創建文件,請不要運行轉換。

+0

這將是解決此問題的一種方法。我希望能夠創建一個解決方案,讓我的客戶可以自己做出任何必要的更改,而無需讓我回來。因此,我希望在XSLT中做所有事情。 –

1

如果使用XSLT 2.0那麼你可以使用xsl:result-document寫你的結果文件,並可以動態地決定是否將其寫入與否。 (總會有一個主輸出,但你可以將它指向/ dev/null)。

0

我認爲mzjn的答案可能是最好的(總是省略聲明)。但是,如果您需要聲明,則可以在<xsl:output>標記中使用omit-xml-declaration="yes",但隨後僅在有條件的情況下將的XML聲明放在頂部。