2013-02-28 21 views
5

XML Input:C#/XSLT: Linearizing XML đang phần nào làm việc

<foobar> 
      <Comments> 
      Reported By: L &amp; A Q TESTING, TESTED 
      Date of TESTING: Available 
      TESTING unavailable to resolve Test issue. 
      Additional Comments: Comments 

      Had to go into Testing System and change to the correct notification group. Per sup. 
      </Comments> 
</foobar> 

Mã XSLT:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:strip-space elements="*"/> 
    <xsl:output indent="no" omit-xml-declaration="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="text()"> 
     <xsl:value-of select="normalize-space()" /> 
    </xsl:template> 
    <xsl:template match="text()[../*]"/> 
</xsl:stylesheet> 

Dự kiến ​​sản lượng:

<foobar><Comments>Reported By: L &amp; A Q TESTING, TESTED Date of TESTING: Available TESTING unavailable to resolve Test issue. Additional Comments: Comments Had to go into Testing System and change to the correct notification group. Per sup.</Comments></foobar> 

Những gì tôi nhận được:

<foobar> 
    <Comments>Reported By: L &amp; A Q TESTING, TESTED Date of TESTING: Available TESTING unavailable to resolve Test issue. Additional Comments: Comments Had to go into Testing System and change to the correct notification group. Per sup.</Comments> 
</foobar> 

Observation:

Mặc dù khoảng trắng không cần thiết từ text() các nút đã được sửa chữa .. Vẫn còn đó là thụt đầu dòng trong kết quả XML.

Lý tưởng nhất strip-space nên chăm sóc nó .. trên đầu trang của nó tôi đã thêm mã dưới đây

<xsl:template match="text()[../*]"/> 

Vẫn không có may mắn !! Việc sử dụng

XPathDocument xpathXmlOrig = new XPathDocument(string_xmlInput); trong các lỗi C# mã của tôi nói rằng .. không gian dải không thể áp dụng cho tài liệu đã được tải !! Vì vậy, tôi đang sử dụng XMLReader ..

Thêm mã C# để tham khảo ..

 XslCompiledTransform xslTransform = new XslCompiledTransform(); 
     string xslinput = "<?xml version=\"1.0\"?><xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"><xsl:strip-space elements=\"*\"/><xsl:output indent=\"no\" omit-xml-declaration=\"yes\"/><xsl:template match=\"@*|node()\"><xsl:copy><xsl:apply-templates select=\"@*|node()\"/></xsl:copy></xsl:template><xsl:template match=\"text()[not(../*)]\"><xsl:value-of select=\"normalize-space()\" /></xsl:template><xsl:template match=\"text()[../*]\"/></xsl:stylesheet>"; 

     string strXmlOutput = string.Empty; 
     StringWriter swXmlOutput = null; 
     MemoryStream objMemoryStream = null; 
     swXmlOutput = new StringWriter(); 
     objMemoryStream = new MemoryStream(); 

     UTC_Calc obj = new UTC_Calc(); 
     XsltArgumentList xslArg = new XsltArgumentList(); 
     .......... 
     ........ 
     XmlReader reader = XmlReader.Create(string_xmlInput, settings); 

     XsltSettings xslsettings = new XsltSettings(false, true); 
     MemoryStream memStream = new MemoryStream(); 

     XmlReader rd = XmlReader.Create(new StringReader(xslinput)); 

     xslTransform.Load(rd); 
     xslTransform.Transform(reader, xslArg, objMemoryStream); 
     objMemoryStream.Position = 0; 
     StreamReader objStreamReader = new StreamReader(objMemoryStream); 
     strXmlOutput = objStreamReader.ReadToEnd(); 
     .......... 
     ........ 

     XmlDocument outputxml = new XmlDocument(); 
     outputxml.LoadXml(strXmlOutput); 
     outputxml.Save(outputfile.FileName); 
+1

+1 cho một bộ dữ liệu khá toàn diện. –

+0

Cảm ơn bạn đã đánh giá cao .. – Enthusiastic

+1

Đối với những gì nó có giá trị, tôi đã thử stylesheet của bạn với cả hai 'xsltproc' và Saxon (9.1.0.5J) và trong cả hai trường hợp, đầu ra là sản lượng dự kiến ​​của bạn. –

Trả lời

0

Dùng

TextWriter writer = File.CreateText(outputfile.FileName); 
writer.Write(strXmlOutput); 
writer.Close(); 

Thay vì mã hiện tại:

XmlDocument outputxml = new XmlDocument(); 
outputxml.LoadXml(strXmlOutput); 
outputxml.Save(outputfile.FileName); 

Tôi nghĩ tôi hiểu sự khác biệt cũng ..

XmlDocument (outputxml.LoadXml, outputxml.Save), theo mặc định thi hành thụt đầu dòng .. dù strXmlOutput không có bất kỳ vết lõm ..

tôi đã sửa chữa này ám chỉ câu trả lời Jake Heidt của .. đánh dấu nó như là cộng đồng wiki, vì nó không phải là câu trả lời rất riêng của tôi . Ngoài ra, câu trả lời này có thể được chỉnh sửa với thông tin hữu ích hơn (nếu cần)

1

bạn có thể đọc lướt qua mã của bạn, và tìm kiếm bất kỳ XmlWriterSettings rằng bạn đang đưa ra để dòng ghi của bạn? Kiểm tra kỹ xem nó không sử dụng tùy chọn đầu ra thụt vào hay không.

Nếu không có gì ở đó, có thể chuyển rõ ràng trong XmlWriterSettings tuyên bố rằng không có định dạng nào sẽ xảy ra sẽ khắc phục điều này.

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Indent = false; 
/* .... */ 

var outWriter = XmlWriter.Create(outputstream, settings); 

http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.aspx

+0

Cảm ơn đề nghị .. Làm việc trên nó .. – Enthusiastic

+0

Đề xuất của bạn là xứng đáng. Tôi đã đăng giải pháp thực tế như là một câu trả lời và chấp nhận nó .. Upvoted câu trả lời của bạn .. Cũng đã làm cho câu trả lời của tôi như wiki để nó có thể được chỉnh sửa bởi bất cứ ai! (xin vui lòng xem lại nó khi bạn có thời gian, nếu nó cần một số gợi ý) cảm ơn một lần nữa! – Enthusiastic

Các vấn đề liên quan