2011-07-05 79 views
2

我的xsl文件中有以下行:Xsl轉換在兩個<xsl:value-of select之間切換空間

 network <xsl:value-of select="/config/areas/inside/network"/>&#32;<xsl:value-of select="/config/areas/inside/subnetmask"/> 

我在C#中的轉換代碼:

  XPathDocument xPathDoc = new XPathDocument(xmlPath); 
     //XslTransform xslTrans = new XslTransform(); -> Deprecated! 
     XslCompiledTransform xslTrans = new XslCompiledTransform(); 

     XmlTextWriter writer = new XmlTextWriter("config.cfg", Encoding.UTF8); 

     xslTrans.Load(xslPath); 

     xslTrans.Transform(xPathDoc, null, writer); 

     writer.Close(); 

對於不推薦使用的版本,一切正常(在我爲空間放置ASCII代碼之後)在兩個元素之間),但XslCompiledTransform類中有一些其他的規範化算法,我不知道如何避免這種行爲。

有什麼建議嗎?

+0

什麼是「一切正常」,什麼是「這種行爲」?請提供XSLT轉換的輸出並說明問題所在......以可理解的方式定義您的問題是第一個,也是非常明顯的建議。 –

回答

4

好的,您的問題在於,當您將&#32;放在XML文檔中時,這在技術上與輸入普通空間沒什麼兩樣,因此XML解析器將其視爲空白。

我建議改變該行

<xsl:value-of select="concat('network ',/config/areas/inside/network,' ',/config/areas/inside/subnetmask)" />

通過圍繞這樣一個concat函數內的空間,它不是坐​​在XML文檔中作爲它自己的一個節點,也不會誤認爲無關緊要的空白。

不相關的問題,但我也建議包裝在using塊XmlTextWriter

using (XmlTextWriter writer = new XmlTextWriter("config.cfg", Encoding.UTF8)) 
{ 
    xslTrans.Load(xslPath); 
    xslTrans.Transform(xPathDoc, null, writer); 
} 

它會自動正確處理的作家中的設置

+0

不錯,我會盡快嘗試,並將其答案標記爲接受,如果它的工作。如果我正在使用using語句或者dispose是否也爲我處理,我應該調用writer.Close()嗎? – timmkrause

+0

@tkrause在使用'using'語句時,不需要關閉writer,dispose處理所有的清理操作。 – Justin

+0

輝煌,我不是很熟悉xslt,它是方法和命令。謝謝! :) – timmkrause