最近工作中需要把XML文件按照一定的格式转成PDF文件,需要写一些XSL文件把对应的XML文件中的数据按照相应的格式成PDF文件,因此了解了下XSL的基本用法。
把XML转换成PDF用到的是FOP工具包,主要用法如下:
1: private const string COMMAND_LINE = "Tools\\jre\\bin\\java";
2: private const string COMMAND_LINE_ARGUMENTS = "-cp Tools\\fop\\lib\\fop.jar;Tools\\fop\\lib\\xml-apis-1.3.02.jar;" +
3: "Tools\\fop\\lib\\xercesImpl-2.7.1.jar;Tools\\fop\\lib\\xalan-2.7.0.jar;Tools\\fop\\lib\\serializer-2.7.0.jar;" +
4: "Tools\\fop\\lib\\batik-all-1.6.jar;Tools\\fop\\lib\\xmlgraphics-comm+ons-1.2.jar;Tools\\fop\\lib\\avalon-framework-4.2.0.jar;" +
5: "Tools\\fop\\lib\\commons-io-1.3.1.jar;Tools\\fop\\lib\\commons-logging-1.0.4.jar org.apache.fop.cli.Main -xml {0} -xsl {1} -pdf \"{2}\"";
6:
7:
8:
9: Process aProcess = new Process();
10: aProcess.StartInfo.CreateNoWindow = true;
11: aProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
12: aProcess.StartInfo.FileName = COMMAND_LINE;
13: aProcess.StartInfo.Arguments = String.Format(COMMAND_LINE_ARGUMENTS,inputXmlFilePath, inputXslFilePath, outputPdfFilePath);
14: aProcess.Start();
可以看到需要提供三个参数:(1)XML文件 (2)XSL文件 (3)输出的PDF文件路径
关于XML文件,可以自己写程序生成。这是以前唯一知道的方法,这次用的是通过定义XSD(XML Schema Definition),然后通过XmlSerializer来自动生成XML文件。具体做法,以后再写。
回到主题上来,接着说XSL的用法。关于XSL的用法,我主要都是从http://www.w3schools.com/Xsl/ 这里学到的,基本上需要用到的时候,在这里面都能找到答案。
遵循XML的规范,XSL文件开始需要用到的namespace,
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
因为主要是通过FO来格式化XML文件的,所以需要引入xmls:fo。
XSLT需要能够访问XML中包含的数据,才能对数据进行format。因此首先要知道XSL中怎么来访问/取得 XML文件中的数据。
举个简单例子,把下面这个XML文件
<SampleXmlData ID="962"> <General> <Name>TestName</Name> <Description>TestDescription</Description> </General> </SampleXmlData>
转换成如下形式:
ID | 962 |
Name | TestName |
Description | TestDescription |
显然,首先我们需要把上面XML文件中相应的数据读出来,其中包括两个element数据(Name 和 Description) 和一个Attribute数据(ID)。 可以通过下面的方式来办到,
<xsl:template match="SampleXmlData">
<fo:table>
<fo:table-column column-width="50%"/>
<fo:table-column column-width="50%"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell><fo:block>ID</fo:block></fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="@ID"/></fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell><fo:block>Name</fo:block></fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="General/Name"/></fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell><fo:block>Description</fo:block></fo:table-cell>
<fo:table-cell>
<fo:block><xsl:value-of select="General/Description"/></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</xsl:template>
注意对attribute和element的不同的访问方式。对Attribute需要加上前缀“@”。 这里面用到了xsl:template和fo:table,这都是很基本的用法。具体的用法待续。
总结:本文只是XSL学习的第一步,接下来会涉及到XSL的方方面面。
--To Be Continued--