2009-06-04 40 views
11

Tôi đang cố gắng viết một XSLT sẽ chuyển đổi một tài liệu XML mà tôi có thành một tệp CSV. Dưới đây là một mẫu của XML:Làm cách nào để viết XSLT để chuyển đổi XML thành CSV?

<?xml version="1.0" encoding="utf-8"?> 
<Import> 
    <Users> 
     <User ID="user_1" EmailAddress="[email protected]"> 
      <Contact FirstName="John" LastName="Doe" /> 
      <Address Street1="808 Elm St" City="Anywhere" State="NY" /> 
     </User> 

     <User ID="user_2" EmailAddress="[email protected]"> 
      <Contact FirstName="Jane" LastName="Noone" /> 
      <Address Street1="123 Some Rd" City="Anywhere" State="NY" /> 
     </User>  
    </Users> 
</Import> 

Những gì tôi muốn là một XSLT sẽ ra như vậy:

John,Doe,808 Elm St,Anywhere,NY 
Jane,Noone,123 Some Rd,Anywhere,NY 

Tôi nghĩ rằng tôi có mã # C đúng để bắt đầu chuyển đổi, nhưng chỉ trong trường hợp tôi không, đây là mã mà cũng:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Xsl; 
using System.Configuration; 

namespace UserTransform 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string oldXML = ConfigurationSettings.AppSettings["XMLToBeTransformed"]; 
      string xsltLocation = ConfigurationSettings.AppSettings["XSLTfile"]; 
      string newCSV = ConfigurationSettings.AppSettings["NewCSVLocation"]; 

      XslCompiledTransform transform = new XslCompiledTransform(); 
      transform.Load(xsltLocation); 
      transform.Transform(oldXML, newCSV); 
     } 
    } 
} 

Trả lời

17

Tạo một mẫu phù hợp với tất cả người dùng, sau đó kéo ra thông tin bạn cần theo thứ tự bạn muốn:

<xsl:template match="//User"> 
    <xsl:value-of select="Contact/@FirstName"/>, 
    <xsl:value-of select="Contact/@LastName"/>, 
    <!--etc--> 
</xsl:template> 

Rõ ràng bạn sẽ cần đảm bảo khoảng trắng được xử lý theo cách bạn muốn, với các dòng mới ở đúng vị trí. Tôi sẽ để điều này như một bài tập cho người đọc.

+0

Cảm ơn. Ít nhất cuối cùng nó cũng lấy được các giá trị mà tôi muốn từ tệp XML mẫu của mình (mặc dù định dạng này vẫn còn điên). Vì lý do nào đó, tôi nhận được ngắt dòng và các khoảng trống thừa trong đó bằng cách sử dụng XSLT sau: , ,

-3

Theo kinh nghiệm của tôi, tôi đã luôn luôn sử dụng XSLT trên các mặt hàng điều không phía máy chủ đó là những gì bạn dường như cố gắng với C#

+3

Vâng, đó là xslt được sử dụng từ một exe ... nhưng nói chung nó là * an toàn hơn * để sử dụng xslt tại máy chủ ... nó là rất đau đớn để cố gắng viết xslt để đối phó với mọi bộ xử lý xslt của biến thể trình duyệt. –

+0

Có lẽ không phải là một câu trả lời rất hữu ích ... Tôi chắc chắn đã sử dụng phía máy chủ XSLT trong Java để chuyển đổi dữ liệu XML. Nhanh chóng, hiệu quả, tiêu chuẩn. Điều gì sẽ xảy ra nếu khách hàng của bạn không thể sử dụng javascript? – Brabster

+0

Có lẽ tôi đang bối rối về ý nghĩa của XSLT, nó là một chiếc ô cho bất kỳ và tất cả các biến đổi XML? Ví dụ: nếu tôi sử dụng thư viện SimpleXML của PHP để phân tích cú pháp thông qua một số XML và nhổ nó ra dưới dạng HTML, CSV hoặc bất kỳ thứ gì được coi là XSLT? Tôi nghĩ XSLT là ngôn ngữ đánh dấu/ngôn ngữ riêng của nó –

7

Tôi luôn luôn thích để cho quá trình duyệt XML giảm máy chủ để tiếp tục với công việc đòi hỏi nhiều hơn. Điều đó nói rằng, đây là một XSLT mẫu mà nên dịch XML của bạn và trình bày nó trong một định dạng CSV như được hiển thị ở trên.

Hy vọng mã mẫu này sẽ giúp, nếu không, hãy cho tôi biết.

<xsl:stylesheet version="1.0"> 
    <xsl:template match="/"> 
     <table> 
      <xsl:for-each select="//User"> 
       <tr> 
        <td> 
         <xsl:value-of select="conat('[', @ID, ']')"/> 
         <xsl:value-of select="','"/> 
         <xsl:value-of select="Contact/@FirstName"/> 
         <xsl:value-of select="','"/> 
         <xsl:value-of select="Contact/@LastName"/> 
         <xsl:value-of select="','"/> 
         <xsl:value-of select="Address/@Street1"/> 
         <xsl:value-of select="','"/> 
         <xsl:value-of select="Address/@City"/> 
         <xsl:value-of select="','"/> 
         <xsl:value-of select="Address/@State"/> 
        </td> 
       </tr> 
      </xsl:for-each> 
     </table> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Tôi xin lỗi nhưng điều đó sẽ không hiệu quả vì mã của bạn sẽ tạo thêm ba ngắt dòng. Xem xét sử dụng cho dấu phẩy. – alamar

+1

Cảm ơn bạn đã bình luận của bạn, alamar. Tôi đã đăng toàn bộ giải pháp lên blog của mình, vui lòng xem và cho tôi biết nếu bạn vẫn gặp phải bất kỳ ngắt dòng nào. Tôi cũng đã giải thích một vài điều bạn có thể muốn biết về đầu ra. Đây là bài đăng: http: //www.jroller.com/evans/entry/using_xslt_to_transform_xml –

+0

Sẽ tốt hơn nếu chỉ đặt ',' và '[' vào các phần tử xsl: value-of của riêng chúng. Điều đó sẽ cho phép bạn định dạng nó theo ý muốn và không giới thiệu thêm ngắt dòng. Thực ra ... tôi sẽ chỉnh sửa nó theo định dạng đó. – jsight

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