繁体   English   中英

使用基于XSD的XSLT将XML转换为XML

[英]Transform XML to XML using XSLT based on XSD

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

无论如何,是否可以使用XSD以编程方式生成目标文件? 我想基本上使用现有的XSD创建文件的框架,然后对源文件运行样式表。 然后,我可以将从那里找到的值放入生成的文件中的相应位置。

有什么办法吗? 还是XQuery可能提供了这样的功能?

听起来您正在询问如何序列化DataSet并使用XSLT对其进行转换。 如果是这样,请按照以下步骤操作:

将数据集序列化为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转换应用于数据集

http://msdn.microsoft.com/zh-cn/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将XML格式化为HTML

这是一个使用XSLT将XML转换为HTML表的示例。 它应该很容易采用,因此可以将其与序列化的DataSet一起使用。

假设这是序列化为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> 

借助XSLT 2.0,您可以利用模式信息(针对源文档和目标文档)来使系统能够检查样式表的正确性,如果您尝试访问输入或生成对代码无效的输出,则会向您发出编译时警告。模式。 但我不知道有任何使用该架构的工具来自动创建样式表的过程。 某些XSLT编辑工具(IDE)可能使用模式信息来帮助进行语法指导的编辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM