我正在使用XSLT/Xalan将一个XML文件转换为另一个XML文件。在这样做的时候,我发现当我创建我的XSLT样式表时,我对我想生成的目标文件的节点进行了硬编码。这似乎很奇怪。使用基于XSD的XSLT将XML转换为XML
无论如何要以编程方式使用XSD生成目标文件?我想基本上使用我有的XSD创建文件的骨架,然后针对源文件运行我的样式表。然后,我可以将从那里找到的值插入生成文件中的适当位置。
有没有办法做到这一点?或者可能XQuery提供这样的功能呢?
我正在使用XSLT/Xalan将一个XML文件转换为另一个XML文件。在这样做的时候,我发现当我创建我的XSLT样式表时,我对我想生成的目标文件的节点进行了硬编码。这似乎很奇怪。使用基于XSD的XSLT将XML转换为XML
无论如何要以编程方式使用XSD生成目标文件?我想基本上使用我有的XSD创建文件的骨架,然后针对源文件运行我的样式表。然后,我可以将从那里找到的值插入生成文件中的适当位置。
有没有办法做到这一点?或者可能XQuery提供这样的功能呢?
听起来好像您在问如何序列化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>
使用XSLT 2.0,你可以利用的架构信息(用于源文档和目标文档),使系统能够检查样式表是否正确,如果您尝试访问输入或生成对模式无效的输出,则会给您提供编译时警告。但是我没有意识到任何使用该模式来自动创建样式表的过程的工具。可能有些XSLT编辑工具(IDE)使用模式信息来帮助编辑语法。
这个问题没有什么意义,你会*将源节点和目标节点硬编码到你的样式表中,因为你正在定义从一个模式到另一个模式的映射。你怎么能确定这个编程?让我知道如果我失去了一些东西。 – IcedDante