`
woniu1983
  • 浏览: 167829 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【报表】 XSLT 解析普通XML生成表格型XML(三)

    博客分类:
  • XSLT
阅读更多
3. XSLT 解析XML为表格型XML的实例(具体请参考附件)
 
附件内容:
  1. DepInOutData.xml --- 源数据xml
  2. Pattern.xsl  --- xslt文件
  3. DepInOutDataResult.xml ---解析结果
 

* 感兴趣的人可以去下个Eclipse Xslt插件:Orangevolt XSLT。它可以帮助你使用指定的xsl解析指定的xml,无须写java代码。

  需求:根据下面xml中的各中心/部门/科室的收入支出数据,生成一张电子表格,要求同一个中心或者同一个部门的数据的单元格要能合并
(这个是非常简单的一个需求,我们就从这个简单需求入手,看看需要如何操作达到目的)

  提供的源数据XML:参考附件中的DepInOutData.xml
 
<?xml version="1.0" encoding="UTF-8"?>

<Report title="测试XSLT" >
	<Sections>
		<Center name="销售中心">
			<Department name="销售1部">
					<Section>
							<SectionName value="销售1科"/>
							<Input value="100.0"/>
							<Output value="10.0"/>		
					</Section>
					<Section>
							<SectionName value="销售2科"/>
							<Input value="101.0"/>
							<Output value="12.0"/>		
					</Section>
					<Section>
							<SectionName value="销售3科"/>
							<Input value="102.0"/>
							<Output value="11.0"/>		
					</Section>
			</Department>	
			
			<Department name="销售2部">
					<Section>
							<SectionName value="销售4科"/>
							<Input value="100.0"/>
							<Output value="10.0"/>		
					</Section>
					<Section>
							<SectionName value="销售5科"/>
							<Input value="101.0"/>
							<Output value="12.0"/>		
					</Section>
					<Section>
							<SectionName value="销售6科"/>
							<Input value="102.0"/>
							<Output value="11.0"/>		
					</Section>
			</Department>			
		</Center>
		
		<Center name="研发中心">
			<Department name="研发1部">
					<Section>
							<SectionName value="研发1科"/>
							<Input value="100.0"/>
							<Output value="10.0"/>		
					</Section>
					<Section>
							<SectionName value="研发2科"/>
							<Input value="101.0"/>
							<Output value="12.0"/>		
					</Section>
					<Section>
							<SectionName value="研发3科"/>
							<Input value="102.0"/>
							<Output value="11.0"/>		
					</Section>
			</Department>	
			
			<Department name="研发2部">
					<Section>
							<SectionName value="研发4科"/>
							<Input value="0.0"/>
							<Output value="50.0"/>		
					</Section>
					<Section>
							<SectionName value="研发5科"/>
							<Input value="0.0"/>
							<Output value="52.0"/>		
					</Section>
					<Section>
							<SectionName value="研发6科"/>
							<Input value="0.0"/>
							<Output value="51.0"/>		
					</Section>
			</Department>	
			
			<Department name="测试1部">
					<Section>
							<SectionName value="测试1科"/>
							<Input value="0.0"/>
							<Output value="10.0"/>		
					</Section>
					<Section>
							<SectionName value="测试2科"/>
							<Input value="0.0"/>
							<Output value="12.0"/>		
					</Section>
					<Section>
							<SectionName value="测试3科"/>
							<Input value="0.0"/>
							<Output value="11.0"/>		
					</Section>
			</Department>		
		</Center>
	</Sections>
</Report>


下面我就直接给出关键的XSLT代码(具体请参考附件中的Pattern.xsl):
<xsl:for-each select="Report/Sections">
					<!-- Create worksheet dynamically -->
					<xsl:element name="Worksheet">
						<xsl:attribute name="ss:Name">部门收入支出费用表</xsl:attribute>
						<xsl:element name="Table">
						<!-- ExpandedColumnCount 是表格的列数,>实际的数据的列数-->
							<xsl:attribute name="ss:ExpandedColumnCount">6</xsl:attribute>
							<!-- ExpandedRowCount 是表格的行数, >实际数据行数即可-->
							<xsl:attribute name="ss:ExpandedRowCount">
								<xsl:value-of select="count(.//Section)+10"/>
							</xsl:attribute>
							<xsl:attribute name="x:FullColumns">1</xsl:attribute>
							<xsl:attribute name="x:FullRows">1</xsl:attribute>
							<xsl:attribute name="ss:StyleID">s24</xsl:attribute>
							<xsl:attribute name="ss:DefaultColumnWidth">90</xsl:attribute>
							<xsl:attribute name="ss:DefaultRowHeight">18</xsl:attribute>
							<Column ss:StyleID="s24" ss:AutoFitWidth="1" ss:Width="90"/>
							<Column ss:StyleID="s24" ss:AutoFitWidth="1" ss:Width="90"/>
							<Column ss:StyleID="s24" ss:AutoFitWidth="1" ss:Width="90"/>
							<Column ss:StyleID="s24" ss:AutoFitWidth="1" ss:Width="90"/>
							<Column ss:StyleID="s24" ss:AutoFitWidth="1" ss:Width="90"/>
							<!-- 表格的Title-->
							<Row ss:AutoFitHeight="1" ss:Height="18">
								<Cell ss:MergeAcross="4" ss:StyleID="s121">
									<Data ss:Type="String">
										<xsl:value-of select="/Report/@title"/>
									</Data>
								</Cell>								
							</Row>						
							<Row ss:Height="29.25">
								<Cell ss:StyleID="s28">
									<Data ss:Type="String">
										<xsl:value-of select="'总部'"/>
									</Data>
								</Cell>
								<Cell ss:StyleID="s28">
									<Data ss:Type="String">
										<xsl:value-of select="'部门'"/>
									</Data>
								</Cell>
								<Cell ss:StyleID="s28">
									<Data ss:Type="String">
										<xsl:value-of select="'科室'"/>
									</Data>
								</Cell>
								<Cell ss:StyleID="s29">
									<Data ss:Type="String">
										<xsl:value-of select="'收入(万元)'"/>
									</Data>
								</Cell>
								<Cell ss:StyleID="s29">
									<Data ss:Type="String">
										<xsl:value-of select="'支出(万元)'"/>
									</Data>
								</Cell>																			
							</Row>
							<xsl:if test="count(.//Section) > 0">
								<xsl:call-template name="Sections"/>									
							</xsl:if>							
						</xsl:element>
						
					</xsl:element>
				</xsl:for-each>
		

  
   附件中(放心,俺的开发机杀毒软件具备,一般都杀完毒才放心发布的)
有解析后的结果:DepInOutDataResult.xml,使用MS Office2003以上版本打开可以查看。

  首先有必要将上面的几个重要的常量解释下
    1. ss:ExpandedColumnCount是定义表格的列数
    测试中我发现这个数值必须大于实际的列数,例如在本例中,我的实际列数是5列(中心/部门/科室/收入/支出),那么赋值的时候使用的是6, 如果使用的是5的话,解析的结果文件使用Office无法打开,提示格式错误信息,不信的同学可以尝试下:
   
<xsl:attribute name="ss:ExpandedColumnCount">6</xsl:attribute>


    2.  ss:ExpandedRowCount是定义表格的行数,当然肯定要大于实际的行数,这里我做了个算式:统计出源数据xml中Section个数+10
<xsl:attribute name="ss:ExpandedRowCount">
								<xsl:value-of select="count(.//Section)+10"/>
							</xsl:attribute>

    3. Column... 标签是定义每一列的长宽等属性,实际列数是5列,那么就定义5个Column标签
  
<Column ss:StyleID="s24" ss:AutoFitWidth="1" ss:Width="90"/>


    4. Row... 标签是定义每一行的长宽等属性,实际行数是多少,那么就定义多少个Row标签
  
<Row ss:AutoFitHeight="1" ss:Height="18">						
		</Row>


    5. Cell... 标签是Row的子标签,用于定义每一行中各单元格的数据及样式等等
  
<Cell ss:StyleID="s28">
									<Data ss:Type="String">
										<xsl:value-of select="'总部'"/>
									</Data>
								</Cell>


   6. xsl:call-template标签是调用函数的, 具体调用哪一个函数则通过属性name指定。
      本例中填充各项数据,合并单元格等操作都是在函数“Sections”及其子函数中完成
  
<xsl:call-template name="Sections"/>


   7. ss:MergeAcross是Cell的属性, 用于单元格的横向合并
      下面的例子表示:合并当前单元格右边的4个单元格(即横向区域总共5个单元格被合并)
     
<Cell ss:MergeAcross="4" ss:StyleID="s121">


   8. ss:MergeDown是Cell的属性, 用于单元格的纵向合并
      下面的例子表示:合并当前单元格下边的4个单元格(即纵向区域总共5个单元格被合并)
     
<Cell ss:MergeDown="4" ss:StyleID="s121">


  以上即是关键部分,原本想就后面的函数多解释解释,但想来是没大必要的,不仅仅是简单的缘故,相信大家都是牛**的developer,所以解释的太多反倒不美。所以就此打住,刚接触xslt的同学参考例子多思考思考,多写写就可以了

  
0
0
分享到:
评论

相关推荐

    Birt XML详解

    3. **解析XML**:Birt提供了两种解析方式——XPath和XSLT。XPath用于定位XML文档中的节点,而XSLT则用于转换XML数据。 4. **定义数据集**:通过XPath表达式选择需要的数据,并创建数据集。数据集是Birt中数据的逻辑...

    用xml 和 xsl 实现二维报表

    在我们的场景中,(StatisDocumentByDepart).xsl是用于解析XML数据并将其格式化为报表的XSL样式表。XSLT(XSL Transformations)是XSL的一个子集,专门用于转换XML文档。以下是一个简单的XSLT示例,它将XML数据转换为...

    XML应用开发(软件品牌)-1期 第5单元 单元测试卷答案-使用XSLT显示XML文档.doc

    第二个例子同样生成表格,但增加了使用`&lt;xsl:choose&gt;`进行条件判断,可能用于对特定的CD元素进行特殊处理。 【总结】 XML和XSLT的结合使用使得数据的表示和呈现变得灵活多样。通过XSLT,开发者可以定制XML数据的...

    Asp报表设计源码 xml数据交换

    综上所述,Asp报表设计源码和XML数据交换是一个深度学习的话题,涵盖了Web开发中的许多核心概念,包括动态网页生成、数据绑定、XML处理和客户端服务器通信。对这个主题的深入理解和实践,对于提升Asp应用开发能力,...

    XML+XSL/FO生成PDF文件Demo

    总之,XML+XSL/FO+FOP技术栈提供了一种强大的方法,将结构化的XML数据转换为专业品质的PDF文档,适合于各种业务场景,如自动化报表生成、电子出版物制作等。熟悉这一流程对于IT从业者,尤其是从事数据处理、文档管理...

    birt xml数据源

    - **API返回的XML数据**:当API返回XML格式的结果时,可以使用BIRT解析并生成报表。 - **自定义数据交换格式**:企业内部可能有基于XML的自定义数据格式,BIRT提供了一个灵活的平台来处理这些数据。 7. **MHT文件...

    xml publisher介绍

    在XML Publisher中,XSLT用于将XML数据映射到模板,生成最终的输出格式。 4. **输出生成**:最后,XML Publisher根据模板和数据生成最终的文档。用户可以选择不同的输出格式,如PDF用于打印,HTML用于网页展示,...

    通过xml格式存为excel文件

    在IT行业中,Excel文件是一种广泛使用的数据存储和分析工具,特别是在数据分析、报表生成以及数据交换等领域。XML(Extensible Markup Language)则是一种用于存储和传输数据的标记语言,它的结构化特性使得它非常...

    xml的班级template应用

    当XSLT处理器应用`ex6.xsl`到`banji.xml`时,它会根据模板的匹配规则对XML文档进行转换,生成一个新的HTML文档,该文档可以被浏览器解析并显示为一个包含班级所有学生信息的表格。 总结来说,XML和XSLT的结合使用...

    ASP与XML 高级编程

    2. **数据解析**:ASP可以使用DOM(Document Object Model)或SAX(Simple API for XML)解析XML文档。DOM将整个XML文档加载到内存中,形成一个树形结构,便于访问和操作;SAX则采用事件驱动的方式,逐个处理XML元素...

    用XSL把XML转化在EXCEL导出

    3. XSLT转换:使用XSLT处理器(如Saxon或Xalan)对XML和XSL进行解析和转换。 4. 输出Excel:转换后的结果通常为一个临时的HTML或XML文件,可以被浏览器或专门的工具识别并呈现为Excel格式。 5. 反台处理:服务器端的...

    iReport5.6&Jasperreport;开发报表所需全部jar.zip

    例如jasperreports.jar,它包含了报表引擎,负责解析JRXML文件并生成报表。 2. **iReport Designer**: 这是iReport的运行时库,如ireport-designer.jar,它提供了报表设计界面和相关功能。这些JAR文件帮助开发者在...

    跟我学XSL(pdf)

    - XSL由XSLT(Transformations)、XPath(Path)和XSL-FO(Formatting Objects)三部分组成。 - XSLT用于定义转换规则,将XML文档转换成新的XML或非XML格式。 - XPath是查询XML文档中节点的语言,为XSLT提供导航...

    java developer xalan tools.zip

    2. **数据格式化**:对于处理结构化数据,如报表或日志,Xalan可以将XML数据格式化为易于阅读的文本或表格形式。 3. **动态文档生成**:在服务器端,Xalan可以结合Java后端逻辑动态生成定制化的HTML或其他文档格式,...

    ASP.NET网络打印

    ### ASP.NET网络打印知识点详解 #### 一、网络打印概述 在B/S架构下,Web应用程序中的打印功能具有一定的特殊性。...而对于复杂的报表打印,则可能需要结合.NET组件、XSLT转换或其他第三方库来实现。

    excel的jar包.rar

    在处理Excel时,dom4j可能被用来辅助解析或生成XML数据。 在Java开发中,这些库可以用于以下场景: - **读取Excel文件**:从Excel文件中提取数据,例如报表、数据库导入或数据分析。 - **写入Excel文件**:生成报告...

    【转】通用从数据库导出excel、excel导入数据库组件

    7. dom4j-1.6.1.jar:DOM4J,一个Java XML API,用于处理XML、XPath和XSLT。 8. junit-3.8.1.jar:JUnit测试框架的早期版本,用于编写和运行单元测试。 9. commons-logging-1.1.jar:Apache Commons Logging,一个...

Global site tag (gtag.js) - Google Analytics