2011-10-14 81 views
1

我正在使用XSLT/Xalan将一个XML文件转换为另一个XML文件。在这样做的时候,我发现当我创建我的XSLT样式表时,我对我想生成的目标文件的节点进行了硬编码。这似乎很奇怪。使用基于XSD的XSLT将XML转换为XML

无论如何要以编程方式使用XSD生成目标文件?我想基本上使用我有的XSD创建文件的骨架,然后针对源文件运行我的样式表。然后,我可以将从那里找到的值插入生成文件中的适当位置。

有没有办法做到这一点?或者可能XQuery提供这样的功能呢?

+0

这个问题没有什么意义,你会*将源节点和目标节点硬编码到你的样式表中,因为你正在定义从一个模式到另一个模式的映射。你怎么能确定这个编程?让我知道如果我失去了一些东西。 – IcedDante

回答

1

听起来好像您在问如何序列化DataSet并使用XSLT进行转换。如果是这样,这里是你如何能做到这一点:

序列化的DataSet 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(); 

至于以可读格式显示出来,我会建议传递XML到XSL转换,这然后您可以使用解析XML并根据需要操作输出。

应用XSLT转换到DataSet

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

这里有一个简单的例子,我创建的解释你将如何使用XSL转换。我没有测试它,但它应该是相当接近:

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(); 

使用XSLT

下面是使用XSLT将XML转换为HTML表的一个例子格式化XML作为HTML。它应该相当容易采用,所以你可以在你的序列化数据集中使用它。

比方说,这是你的数据集,序列化到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> 

下面是转换的数据集,以HTML的XSLT脚本:

<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> 
0

使用XSLT 2.0,你可以利用的架构信息(用于源文档和目标文档),使系统能够检查样式表是否正确,如果您尝试访问输入或生成对模式无效的输出,则会给您提供编译时警告。但是我没有意识到任何使用该模式来自动创建样式表的过程的工具。可能有些XSLT编辑工具(IDE)使用模式信息来帮助编辑语法。