`
lizhengjun
  • 浏览: 44236 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

XML Schema / XML / XSLT 综合运用之电子表单

阅读更多

此为末学在开发OA系统中针对电子表单功能块所进行的实验性方案,因此前对XML虽有所了解,但运用并不熟练,幸于W3chool 等网站受益颇多,耗费一周始才完成,古人有云“滴水之恩,当以涌泉相报”,故将此拙作奉献于广大软件技术爱好者,虽不敢以涌泉而自诩,但于初学或有所益也。


以下张贴内容版权开放,转载请注明出处。


电子表单内容由XML文件来承载,在具体创建表单时,因怕对格式书写有误,故用XML Schema以约束之,而用户在系统中填报表单所面对的应是Web页面,故又以XSLT加以转换,所有关联文件分贴如下:

 

XML模板文件: form.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.w3school.com.cn/eForm"
	elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"
	xmlns:ef="http://www.w3school.com.cn/eForm">

	<xs:attributeGroup name="fieldAttributeGroup">
		<xs:attribute name="id" type="xs:Name" use="required" />
		<xs:attribute name="label" type="xs:token" use="required" />
		<xs:attribute name="require" type="xs:boolean" use="optional" />
		<xs:attribute name="description" type="xs:token" use="optional" />
	</xs:attributeGroup>

	<xs:complexType name="stringField">
		<xs:attributeGroup ref="ef:fieldAttributeGroup" />
		<xs:attribute name="value" type="xs:token" />
	</xs:complexType>

	<xs:complexType name="textField">
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attributeGroup ref="ef:fieldAttributeGroup" />
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>

	<xs:complexType name="numbleField">
		<xs:attributeGroup ref="ef:fieldAttributeGroup" />
		<xs:attribute name="value" type="xs:decimal" />
	</xs:complexType>

	<xs:complexType name="dateField">
		<xs:attributeGroup ref="ef:fieldAttributeGroup" />
		<xs:attribute name="value" type="xs:date" />
	</xs:complexType>

	<xs:complexType name="singleChoiceField">
		<xs:all>
			<xs:element name="options" type="ef:options" />
		</xs:all>
		<xs:attributeGroup ref="ef:fieldAttributeGroup" />
	</xs:complexType>

	<xs:complexType name="multipleChoiceField">
		<xs:all>
			<xs:element name="options" type="ef:options" />
		</xs:all>
		<xs:attributeGroup ref="ef:fieldAttributeGroup" />
	</xs:complexType>

	<xs:complexType name="options">
		<xs:choice minOccurs="2" maxOccurs="unbounded">
			<xs:element name="option" type="ef:option" />
		</xs:choice>

	</xs:complexType>

	<xs:complexType name="option">
		<xs:simpleContent>
			<xs:extension base="xs:normalizedString">
				<xs:attribute name="checked" type="xs:boolean" />
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>

	<xs:complexType name="group">
		<xs:group ref="ef:field" minOccurs="1" maxOccurs="unbounded" />
		<xs:attribute name="label" type="xs:token" use="required" />
	</xs:complexType>

	<xs:group name="field">
		<xs:choice>
			<xs:element name="dateField" type="ef:dateField" nillable="true" />
			<xs:element name="multipleChoiceField" type="ef:multipleChoiceField" />
			<xs:element name="numbleField" type="ef:numbleField"
				nillable="true" />
			<xs:element name="singleChoiceField" type="ef:singleChoiceField" />
			<xs:element name="stringField" type="ef:stringField"
				nillable="true" />
			<xs:element name="textField" type="ef:textField" nillable="true" />
			<xs:element name="group" type="ef:group" />
		</xs:choice>
	</xs:group>

	<xs:element name="form">
		<xs:complexType>
			<xs:group ref="ef:field" minOccurs="1" maxOccurs="unbounded" />
		</xs:complexType>
		<xs:key name="ID">
			<xs:selector
				xpath=".//ef:dateField | .//ef:multipleChoiceField | .//ef:numbleField | .//ef:singleChoiceField | .//ef:stringField | .//ef:textField" />
			<xs:field xpath="@id" />
		</xs:key>
	</xs:element>

</xs:schema>

 

xml示例文件:sample.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="formEdit.xsl"?>
<ef:form xmlns:ef="http://www.w3school.com.cn/eForm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.w3school.com.cn/eForm form.xsd ">
	<ef:multipleChoiceField label="多选1" id="duoxuan1" description="描述多选字段">
		<ef:options>
			<ef:option>选项1</ef:option>
			<ef:option checked="true">选项2</ef:option>
			<ef:option>选项3</ef:option>
		</ef:options>
	</ef:multipleChoiceField>
	<ef:group label="组1">
		<ef:dateField label="时间" id="shijian" description="描述时间字段"/>
		<ef:numbleField label="数字" id="shuzi" value="2"/>
	</ef:group>
	<ef:dateField label="时间1" id="shijian1" value="2009-01-01" />
	<ef:dateField label="时间2" id="shijian2" />
	<ef:stringField label="字符串1" id="zifuchuan" value="默认字符串"/>
	<ef:textField label="常字符串" id="DD">
	你好
	我很好
	</ef:textField>
	<ef:group label="组2">
		<ef:singleChoiceField label="单选" id="danxuan">
			<ef:options>
				<ef:option>选项1</ef:option>
				<ef:option>选项2</ef:option>
				<ef:option>选项3</ef:option>
			</ef:options>
		</ef:singleChoiceField>
	</ef:group>
</ef:form>

 

xslt转换文件:formEdit.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ef="http://www.w3school.com.cn/eForm">
	<xsl:template match="/">
		<html>
			<head>
				<title>显示表单</title>
				<link type="text/css" rel="stylesheet" href="ef.css" />
			</head>
			<body>
				<xsl:apply-templates />
			</body>
		</html>
	</xsl:template>

	<!-- 组模板 -->
	<xsl:template match="ef:group">
		<fieldSet class="ef-group">
			<legend>
				<xsl:value-of select="@label"></xsl:value-of>
			</legend>
			<xsl:apply-templates />
		</fieldSet>
	</xsl:template>

	<!-- 日期字段模板 -->
	<xsl:template match="ef:dateField">
		<div class="ef-date-field">
			<xsl:call-template name="fieldLabel" />
			<div class="ef-input-control">
				<input type="text">
					<xsl:call-template name="inputControlAttribute" />
				</input>
			</div>
		</div>
	</xsl:template>

	<!-- input输入控件属性模板 -->
	<xsl:template name="inputControlAttribute">
		<xsl:attribute name="id">
			<xsl:value-of select="@id" />
		</xsl:attribute>
		<xsl:attribute name="name">
			<xsl:value-of select="@id" />
		</xsl:attribute>
		<xsl:attribute name="value">
			<xsl:value-of select="@value" />
		</xsl:attribute>
	</xsl:template>

	<!-- 字段标签模板 -->
	<xsl:template name="fieldLabel">
		<label class="ef-field-label">
			<xsl:attribute name="for">
				<xsl:value-of select="@id" />
			</xsl:attribute>
			<xsl:attribute name="title">
				<xsl:value-of select="@description" />
			</xsl:attribute>
			<xsl:value-of select="@label" />
		</label>
	</xsl:template>

	<!-- 选项属性模板 -->
	<xsl:template name="choiceOptionAttribute">
		<xsl:param name="choiceFieldId" />
		<xsl:attribute name="id">
			<xsl:value-of select="$choiceFieldId" />
			<xsl:number />
		</xsl:attribute>
		<xsl:attribute name="name">
			<xsl:value-of select="$choiceFieldId" />
		</xsl:attribute>
		<xsl:attribute name="value">
			<xsl:choose>
				<xsl:when test="@value">
					<xsl:value-of select="@value" />
				</xsl:when>
				<xsl:otherwise>
					<xsl:value-of select="text()" />
				</xsl:otherwise>
			</xsl:choose>
		</xsl:attribute>
		<xsl:if test="@checked = 'true'">
			<xsl:attribute name="checked"> 
				<xsl:value-of select="'checked'" /> 
			</xsl:attribute>
		</xsl:if>
	</xsl:template>

	<!-- 选项标签模板 -->
	<xsl:template name="optionLabel">
		<xsl:param name="choiceFieldId" />
		<label>
			<xsl:attribute name="for">
				<xsl:value-of select="$choiceFieldId" />
				<xsl:number />
			</xsl:attribute>
			<xsl:value-of select="text()" />
		</label>
	</xsl:template>

	<!-- 多选字段模板 -->
	<xsl:template match="ef:multipleChoiceField">
		<xsl:variable name="choiceFieldId" select="@id" />
		<div class="ef-multiple-choice-field">
			<xsl:call-template name="fieldLabel" />
			<div class="ef-checkbox-group">
				<xsl:for-each select="ef:options/ef:option">
					<div class="ef-checkbox">
						<input type="checkbox">
							<xsl:call-template name="choiceOptionAttribute">
								<xsl:with-param name="choiceFieldId" select="$choiceFieldId" />
							</xsl:call-template>
						</input>
						<xsl:call-template name="optionLabel">
							<xsl:with-param name="choiceFieldId" select="$choiceFieldId" />
						</xsl:call-template>
					</div>
				</xsl:for-each>
			</div>
		</div>
	</xsl:template>

	<!-- 数字字段模板 -->
	<xsl:template match="ef:numbleField">
		<div class="ef-numble-field">
			<xsl:call-template name="fieldLabel" />
			<div class="ef-input-control">
				<input type="text">
					<xsl:call-template name="inputControlAttribute" />
				</input>
			</div>
		</div>
	</xsl:template>

	<!-- 单选字段模板 -->
	<xsl:template match="ef:singleChoiceField">
		<xsl:variable name="choiceFieldId" select="@id" />
		<div class="ef-single-choice-field">
			<xsl:call-template name="fieldLabel" />
			<div class="ef-radio-group">
				<xsl:for-each select="ef:options/ef:option">
					<div class="ef-radio">
						<input type="radio">
							<xsl:call-template name="choiceOptionAttribute">
								<xsl:with-param name="choiceFieldId" select="$choiceFieldId" />
							</xsl:call-template>
						</input>
						<xsl:call-template name="optionLabel">
							<xsl:with-param name="choiceFieldId" select="$choiceFieldId" />
						</xsl:call-template>
					</div>
				</xsl:for-each>
			</div>
		</div>
	</xsl:template>

	<!-- 字符串字段模板 -->
	<xsl:template match="ef:stringField">
		<div class="ef-string-field">
			<xsl:call-template name="fieldLabel" />
			<div class="ef-input-control">
				<input type="text">
					<xsl:call-template name="inputControlAttribute" />
				</input>
			</div>
		</div>
	</xsl:template>

	<!-- 长文本字段模板 -->
	<xsl:template match="ef:textField">
		<div class="ef-text-field">
			<xsl:call-template name="fieldLabel" />
			<div class="ef-textarea-control">
				<textarea>
					<xsl:attribute name="id">
						<xsl:value-of select="@id" />
					</xsl:attribute>
					<xsl:attribute name="name">
						<xsl:value-of select="@id" />
					</xsl:attribute>
					<xsl:value-of select="text()" />
				</textarea>
			</div>
		</div>
	</xsl:template>

</xsl:stylesheet>

 

最后与页面显示有关的css样式表文件:ef.css

@CHARSET "UTF-8";

.ef-group,.ef-date-field,.ef-multiple-choice-field,.ef-numble-field,.ef-single-choice-field,.ef-string-field,.ef-text-field
	{
	margin: 5px;
	width: 100%;
}

.ef-field-label {
	float: left;
	width: 100px;
	font-weight: bold;
}

.ef-checkbox,.ef-radio {
	float: left;
	margin-right: 10px;
}
 

最终效果如下图所示:

0
0
分享到:
评论
2 楼 lizhengjun 2010-09-14  
已经是全部都贴出来了!
1 楼 mike507 2010-08-30  
能不能把formEdit.xsl 文件也发布出来呢?这样不是更有利于大家学习吗?

相关推荐

    XMLSPY 2010 企业版

    xmlspy是符合行业标准的XML开发环境,专门用于设计,编辑和调试企业级的应用程序,包括XML, XML Schema, XSL/XSLT, SOAP, WSDL和互联网服务技术。这是J2EE,.NET和数据库开发人员不可缺少的高性能的开发工具。  最新...

    使用xslt转化xml数据形成word文档导出

    确保XML文档遵循一定的架构,这可以通过创建XML Schema Definition (XSD)文件来实现。XSD文件定义了XML元素的结构和类型,有助于验证XML文档是否有效。 创建XSD文件的过程相对简单,只需在XML编辑器(如Visual ...

    xml自动调用数据库数据填写表单

    3. DTD(Document Type Definition)或XSD(XML Schema Definition):用于定义XML文档的结构和数据类型,确保数据的准确性和一致性。 二、XML与数据库的交互 1. 数据获取:通过XPath或XQuery查询语言,可以从XML...

    XMLSpy 2011中文版破解补丁

    xmlspy是符合行业标准的XML开发环境,专门用于设计,编辑和调试企业级的应用程序,包括XML, XML Schema, XSL/XSLT, SOAP, WSDL 和互联网服务技术。这是J2EE,.NET和数据库开发人员不可缺少的高性能的开发工具。 ...

    Oracle XML核心技术

    Oracle XML技术集成了多种标准和技术,包括XML Schema、XPath、XQuery、XSLT等,旨在提供一个全面的XML解决方案。 #### 二、Oracle XML核心技术解析 ##### 1. XML Schema XML Schema是一种用于描述XML文档结构的...

    Dreamweaver XML 应用

    《Dreamweaver与XML综合应用》 XML(Extensible Markup Language)是一种用于标记数据的语言,它的设计目的是传输和存储数据,而不是显示数据。在IT领域,XML被广泛应用于数据交换、文档存储和Web应用程序中。而...

    XMLSpyEnt2010(注册机)

    xmlspy是符合行业标准的XML开发环境,专门用于设计,编辑和调试企业级的应用程序,包括XML, XML Schema, XSL/XSLT, SOAP, WSDL 和互联网服务技术。这是J2EE,.NET和数据库开发人员不可缺少的高性能的开发工具。 最新...

    动态创建xml问卷

    - **XML文档类型定义(DTD)或XML Schema(XSD)**:这些工具可以用来定义XML文档的结构和数据类型,确保文档的合规性。 2. **ASP.NET环境** - **ASP.NET Web Forms**:一种常用的开发模型,允许开发者通过控件和事件...

    Schema驱动,生成用户界面的技术和实现

    特别是在那些需要频繁更新或调整用户界面的场景下(例如,基于不同Schema版本的表单),手动开发的方式显得尤为低效。因此,寻找一种能够自动根据Schema生成用户界面的方法显得尤为重要。 #### 技术实现 ##### ...

    XML入门经典(第4版).part1.rar

    主要内容有XML基本语法、DTD、XML Schema、RELAX NG、XPath、XSLT、XQuery、DOM、SAX、RSS、Web服务、Ajax、SOAP、CSS、XHTML、SVG和XForms等,每章都有习题,书后附有参考答案,可帮助你全面掌握XML及其应用方法。

    微软内部XML培训课件7

    7.1.1 XSLT样式表单定义了转换过程,输入是XML文档,输出可以是多种格式。样式模板通过匹配XML元素来定义转换逻辑。 7.1.2 XSLT样式表单由模板组成,每个模板定义了一个匹配模式,和等指令用于处理和输出数据。此外...

    xml实用大全,word版

    XML文档还包含DTD(Document Type Definition)或XSD(XML Schema Definition)来定义文档结构和数据类型。DTD是一种早期的验证机制,而XSD则提供了更复杂的数据类型和结构约束。 XML在IT行业中的应用广泛,包括但...

    基于XML技术的留言本

    2. **DTD(Document Type Definition)或XSD(XML Schema Definition)**:为了验证XML文档的结构和内容是否符合预设规范,可以使用DTD或XSD定义文档结构和数据类型。这有助于确保所有提交的留言都符合预定格式。 3...

    HTML和XML入门

    "XML简述"和"XML教程"会引导你理解XML的基本结构、命名规则、文档类型定义(DTD)或XML Schema用于验证数据的正确性,以及XPath、XSLT等工具来查询和转换XML数据。 XML文档通常包含元素、属性、注释、处理指令等...

    html XML编程宝典

    《HTML与XML编程宝典》是一本深入探讨这两门核心技术的综合指南,旨在帮助读者全面理解和掌握HTML(超文本标记语言)与XML(可扩展标记语言)的编程知识。XML作为数据交换和存储的重要标准,与HTML在互联网应用中...

    改成提交地址为xml的

    3. **XML Schema (XSD)**:XML Schema用于定义XML文档的结构和数据类型,它提供了一种方式来验证接收到的XML数据是否符合规范。 4. **HTTP POST请求**:POST请求常用于向服务器发送数据,如表单提交。在XML提交的...

    XML实用大全 XMLHttp

    这些文件可能包含了XML的语法详解、实例演示、DOM操作、XML Schema定义、XSLT转换技巧以及XMLHttp请求的使用方法、错误处理、跨域问题等内容。 XML的DOM处理涉及将XML文档解析为一棵节点树,每个节点代表XML文档的...

    Ajax模拟面试试题

    以上就是关于Ajax面试题中涉及的一些核心知识点,包括XML的基础、DOM操作、XML Schema、DTD、XPath、XQuery、XSLT以及Asp.NET的XML处理和Web Service的理解。这些内容对于理解Ajax的工作原理和实际应用至关重要。在...

    xml-based-message-board-function.rar_基于xml_留言板

    XML文档遵循严格的规则,包括文档类型定义(DTD)或XML Schema,以确保数据的一致性和有效性。 ### 留言板系统架构 1. **数据存储**:在基于XML的留言板系统中,每条留言会被表示为一个XML元素,包含留言内容、...

    xml网页制基础作教

    2. **文档类型定义(DTD, Document Type Definition)** 或者 **XML Schema(XSD)**:定义元素和属性的结构,确保文档合法性。 3. **注释(Comment)**:用 `&lt;!-- 这里是注释 --&gt;` 来添加解释性文本。 4. **实体...

Global site tag (gtag.js) - Google Analytics