2015-03-19 45 views
2

使用XSLT編譯轉換時我無法完全獲得輸出到格式,它總是會刪除所有空格,並且不是人類可讀形式。XSLTCompiled轉換不遵守文本文件的XSLT格式化

但是如果我運行相同的通過Visual Studio XSLT轉換調試輸出整齊indented.Here是我的代碼是什麼樣子:

XDocument xDoc = XDocument.Load(_xmlFilePath, LoadOptions.PreserveWhitespace); 
var xslDoc = new XmlDocument(); 
xslDoc.Load(_xsltFilePath); 
xslDoc.PreserveWhitespace = true; 
using (Stream outputFile = File.Create(_outputFileName)) 
{ 
    XsltArgumentList xsltParameter = null; 
    StringReader tr = new StringReader(xslDoc.OuterXml); 
    XmlReader xr = new XmlTextReader(tr); 
    XslCompiledTransform transform = new XslCompiledTransform(); 
    XsltSettings setting = new XsltSettings(); 

    setting.EnableScript = true; 
    transform.Load(xr, setting, new XmlUrlResolver()); 
    transform.Transform(xDoc.CreateReader(), xsltParameter, outputFile); 
} 

變換將創建一個文本文件,什麼是Visual Studio的XSLT調試器做的不同,它保留輸出格式?

我已經採取了看看這個鏈接:XSLT Transform not indenting properly

這並不適用於我,因爲我輸出的文本。我應該使用Stream以外的東西嗎?

我的樣品XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
<xsl:output method="text" encoding="UTF-8"/> 

<xsl:template match="/"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="root"> 
    <xsl:text>{Start:</xsl:text> 
    <xsl:text disable-output-escaping="yes">&#xD;</xsl:text> 
    <xsl:value-of select="Child1"/> 
    <xsl:text disable-output-escaping="yes">&#xD;</xsl:text> 
    <xsl:value-of select="Child2"/> 
    <xsl:text disable-output-escaping="yes">&#xD;</xsl:text> 
    <xsl:text>End:}</xsl:text> 
</xsl:template> 

<?xml version="1.0" encoding="utf-8"?> 
    <root> 
    <Child1>Value1</Child1> 
    <Child2>value2</Child2> 
    </root> 

預期輸出:

{Start: 
Value1 
value2 
End:} 

輸出用XSLT變換編譯: {Start:Value1value2End:}

Visual Studio XSLT調試器爲我提供了預期的輸出格式,但XSLT編譯變換會去除所有空格和新行。

+0

請更清楚地陳述你的問題。請準確解釋您現在得到的輸出結果,以及您想要的輸出結果,包括每種輸出的實際示例?請提供[一個很好的,_minimal_,_complete_代碼示例](http://stackoverflow.com/help/mcve),清楚地說明您的問題。 – 2015-03-19 11:37:15

+0

添加我的示例讓我知道如果您需要其他任何東西 – user3313541 2015-03-19 13:56:46

+0

當您使用' '作爲線端時會發生什麼? Windows使用CR/LF作爲線端,而不僅僅是一個CR。有些應用程序可能只接受一個CR或者只接受一個LF。 – 2015-03-19 14:05:50

回答

2

不幸的是,這仍然不是完整的代碼示例。請閱讀我之前提供的鏈接,瞭解我的意思。

這就是說,經過一番努力,我能夠採取零碎和創造一個單一的,獨立的代碼示例。我能夠驗證您的擔憂,我可以通過將disable-output-escaping(不需要)替換爲需要的xml:space="preserve"來解決問題。

請注意,XSL轉換的一部分是首先生成一個表示您的輸出的XML圖。只有在完成之後,纔會創建實際輸出。在這個過程中,獨立的空白將從文檔中刪除。通過添加xml:space="preserve",您可以告訴處理代碼不要刪除那個獨立的空白。

這裏是一個版本的XSL的的作品,你想要的方式:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="text" encoding="UTF-8"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="root"> 
     <xsl:text>{Start:</xsl:text> 
     <xsl:text xml:space="preserve">&#xA;</xsl:text> 
     <xsl:value-of select="Child1"/> 
     <xsl:text xml:space="preserve">&#xA;</xsl:text> 
     <xsl:value-of select="Child2"/> 
     <xsl:text xml:space="preserve">&#xA;</xsl:text> 
     <xsl:text>End:}</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

注:我不得不添加</xsl:stylesheet>結束標記

  • 我改變了CR實體

    • &#xD; LF實體&#xA;。它也適用於回車的方式,但我認爲從可讀性的角度來看,換行更「便攜」。
    • 在上面的示例中,我將xml:space="preserve"應用於每個僅包含空格的xsl:text元素。這確保處理器不會刪除這些元素。

    這是最後一點的權衡。您會注意到,這意味着您必須在每個要保留空白的節點上指定該屬性。另一種,在XSL的可讀性爲代價的,是對屬性適用於整個樣式表:

    <?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
         xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xml:space="preserve"> 
        <xsl:output method="text" encoding="UTF-8"/> 
    
        <xsl:template match="/"><xsl:apply-templates/></xsl:template> 
    
        <xsl:template match="root"><xsl:text>{Start:</xsl:text><xsl:text>&#xD;</xsl:text><xsl:value-of select="Child1"/><xsl:text xml:space="preserve">&#xA;</xsl:text><xsl:value-of select="Child2"/><xsl:text xml:space="preserve">&#xA;</xsl:text><xsl:text>End:}</xsl:text></xsl:template> 
    </xsl:stylesheet> 
    

    顯然不足之處是每個模板的內容必須包含空格只有,你想讓它出現在輸出中。所以你不能使用空格來使XSL本身更具可讀性。但至少你不必一遍又一遍地輸入xml:space="preserve"。你選。 :)

    我想技術上這意味着這不是一個C#問題畢竟。可能應該從你的問題中刪除該標籤。 :)

  • +0

    對不起,我錯誤的XMLWriter不適用於我。但這樣做仍然不縮進我的輸出。還有其他建議嗎? – user3313541 2015-03-19 15:50:33

    +0

    @ user3313541:我能夠根據您提供的內容創建一個良好的工作代碼示例。請參閱上面的編輯以獲取對_XSL_問題的答案。 :) – 2015-03-19 17:03:48

    +0

    工作表示感謝,我很感激我不確定問題出在哪裏,Happy可以在XSLT中修復它。 – user3313541 2015-03-19 17:16:30