Transform XML to XML using XSLT based on XSD

2019-06-04 05:02发布

问题:

I am using XSLT/Xalan to transform one XML file into another. In doing so, I found that when I was creating my XSLT stylesheet, I was hardcoding the nodes of the target file I wanted generated. This just seemed odd.

Is there anyway to programmatically generate the target file using the XSD? I want to basically create the skeleton of the file using the XSD I have and then run my stylesheet against the source file. Then, I can plunk the values I find from there into the appropriate spots in the generated file.

Is there any way to do this? Or does possibly XQuery provide functionality like this instead?

回答1:

It sounds like you're asking how to serialize a DataSet and transform it using XSLT. If so, here is how you can do it:

Serialize a DataSet to XML

DataTable table = new DataTable();     
System.IO.StringWriter writer = new System.IO.StringWriter(); 

//notice that we're ignoring the schema so we get clean XML back 
//you can change the write mode as needed to get your result 
table.WriteXml(writer, XmlWriteMode.IgnoreSchema, false); 

string dataTableXml = writer.ToString(); 

As for displaying it in a readable format, I would suggest passing the XML into an XSL transformer, which you can then use to parse the XML and manipulate the output as needed.

Applying an XSLT Transform to a DataSet

http://msdn.microsoft.com/en-us/library/8fd7xytc%28v=vs.71%29.aspx#Y289

Here's a simple example I created to explain how you would use the XSL transformer. I haven't tested it, but it should be pretty close:

DataSet ds = new DataSet(); 
StringBuilder sbXslOutput = new StringBuilder();  

using (XmlWriter xslWriter = XmlWriter.Create(sbXslOutput)) 
{ 
    XslCompiledTransform transformer = new XslCompiledTransform(); 
    transformer.Load("transformer.xsl"); 
    XsltArgumentList args = new XsltArgumentList(); 

    transformer.Transform(new XmlDataDocument(ds), args, xslWriter); 
} 

string dataSetHtml = sbXslOutput.ToString(); 

Formatting XML as HTML using XSLT

Here's an example of using XSLT to transform XML into an HTML table. It should be fairly easy to adopt so you can use it with your serialized DataSet.

Let's say this is your DataSet, serialized to XML:

<RecentMatter>  
  <UserLogin>PSLTP6\RJK</UserLogin>  
  <MatterNumber>99999-2302</MatterNumber>  
  <ClientName>Test Matters</ClientName>  
  <MatterName>DP Test Matter</MatterName>  
  <ClientCode>99999</ClientCode>  
  <OfficeCode/>  
  <OfficeName/>  
  <Billable>true</Billable>  
  <ReferenceId/>  
  <LastUsed>2011-08-23T23:40:24.13+01:00</LastUsed>  
</RecentMatter>  
<RecentMatter>  
  <UserLogin>PSLTP6\RJK</UserLogin>  
  <MatterNumber>999991.0002</MatterNumber>  
  <ClientName>Lathe 1</ClientName>  
  <MatterName>LW Test 2</MatterName>  
  <ClientCode/>  
  <OfficeCode/>  
  <OfficeName/>  
  <Billable>true</Billable>  
  <ReferenceId/>  
  <LastUsed>2011-07-12T16:57:27.173+01:00</LastUsed>  
</RecentMatter>  
<RecentMatter>  
  <UserLogin>PSLTP6\RJK</UserLogin>  
  <MatterNumber>999991-0001</MatterNumber>  
  <ClientName>Lathe 1</ClientName>  
  <MatterName>LW Test 1</MatterName>  
  <ClientCode/>  
  <OfficeCode/>  
  <OfficeName/>  
  <Billable>false</Billable>  
  <ReferenceId/>  
  <LastUsed>2011-07-12T01:59:06.887+01:00</LastUsed>  
</RecentMatter>  
</NewDataSet>  

Here's an XSLT script that transforms the DataSet to HTML:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
  <xsl:template match="/"> 
      <table border="1"> 
        <tr> 
          <th>User Login</th> 
          <th>Matter Number</th> 
          ... 
        </tr> 
        <xsl:for-each select="NewDataSet/RecentMatter"> 
          <tr> 
            <td> 
              <xsl:value-of select="UserLogin"/> 
            </td> 
            <td> 
              <xsl:value-of select="MatterNumber"/> 
            </td> 
            ... 
          </tr> 
        </xsl:for-each> 
      </table> 
  </xsl:template> 
</xsl:stylesheet> 


回答2:

With XSLT 2.0 you can take advantage of schema information (for both your source and target documents) to enable the system to check your stylesheet for correctness, giving you compile time warnings if you try to access input or generate output that would be invalid against the schema. But I'm not aware of any tools that use the schema to automate the process of creating the stylesheet. It might be that some of the XSLT editing tools (IDEs) use schema information to help with syntax-directed editing.



标签: xml xslt xsd xalan