本发明涉及一种计算机文档转换方法,尤其涉及一种将xmlschema文档转换为xsl文档的方法。
背景技术:
xml是一种数据描述和交换的通用格式,得到了广泛的应用,具有通用性和可交换性。xmlschema用来描述xml文档结构,对xml文档进行约束和验证,其本身也是使用xml文档结构,是基于xml的dtd替代者。xmlschema定义了xml文档的如下参数:可出现在xml文档中的元素、属性;哪个元素是子元素;子元素出现的次序、子元素的数目;元素是否为空、是否可包含文本;元素和属性的数据类型;元素和属性的默认值以及固定值。
xsl(extensiblestylesheetlanguage)是可扩展样式表语言,是一种用于以可读格式呈现xml数据的语言。通俗的讲就是xml文件可以通过引用xsl样式表呈现不同格式,即xsl可以将xml文档转化为xhtml/html文档或者是其他xml文档。
目前,通常采用将xmlschema文档手动编辑为xsl文档或者用商业软件将xmlschema文档自动生成xsl文档的方式实现将xmlschema文档转换为xsl文档的目的。但前者复杂度高,费时费力;后者通常需要大量的修改才能应用于xml中。并且这两种方式都存在一个严重的问题:一旦对xml文档进行了修改,都需要对xsl文档进行重新编辑。
技术实现要素:
本发明的目的就在于为了解决上述问题而提供一种将xmlschema文档转换为xsl文档的方法。
本发明通过以下技术方案来实现上述目的:
一种将xmlschema文档转换为xsl文档的方法,其特征在于:包括以下步骤:
步骤1:先确定xmlschema标准定义中需要关注的元素,然后确定xmlschema标准定义的元素和xsl标准定义的元素之间的映射关系;
步骤2:对xmlschema文档进行解析,获取schema标准中需要关注的第一个元素,并添加到xsl文档中;
步骤3:按照深度优先原则依次对xmlschema文档中的<schema>的子节点中的<element>元素进行解析,查找xmlschema中需要关注的元素并添加到xsl文档中,直到完成整个xmlschema文档的转换。
作为优选,所述步骤1具体包括以下步骤:
步骤(1.1):确定xmlschema标准定义中需要关注的元素包括但不限于以下元素:<xs:elment>元素及其name、type和ref属性;<xs:group>元素;<xs:attribute>元素及其ref属性;<xs:complextype>元素;
步骤(1.2):确定xmlschema标准定义的元素和xsl标准定义的元素之间的映射关系,具体为:<xs:elment>映射为<xsl:template>,并使用match属性关联xml元素和模板;/element/element之间的父子关系映射为template/apply-templates,并使用<apply-templates>的select属性,表示仅处理匹配该属性的值的子元素;<xs:attribute>映射为<xsl:value-of>,用于提取某个选定节点的值;/element/attribute映射为/template/value-of。
所述步骤2具体包括以下步骤:
步骤(2.1):创建xsl文档,并添加域名和版本信息;
步骤(2.2):读取xmlschema文档,获取document对象和根节点;
步骤(2.3):对根节点的子节点进行遍历,获取当前的子节点;
步骤(2.4):如果子节点的名称是element,那么解析节点的type、name和ref属性;
步骤(2.5):根据type、name和ref的值,确定需要关注的第一个元素的名称,并将该元素添加到xsl文档中。
所述步骤3具体包括以下步骤:
步骤(3.1):根据子节点的name、type、ref属性值,确定新的要解析的element元素、element元素的路径xpath、以及element元素节点名称;
步骤(3.2):获取该element元素节点迭代器;
步骤(3.3):根据element元素节点的名称参数,设置当前正在解析的element元素elementtemplate、以及正在解析的element元素节点的名称;
步骤(3.4):判断该element元素是否是叶子节点,如果是,则转到步骤(3.5);如果不是叶子节点,则转到步骤(3.8);
步骤(3.5):判断element元素节点的名称是否是element,如果是,则转到步骤(3.6);如果不是element,则转到步骤(3.7);
步骤(3.6):获取element元素节点的name、type属性值,并根据name和type的值是否为空,判断是否给elementtemplate元素添加子节点value-of;
步骤(3.7):对节点的ref属性值不为空的元素进行处理,确定新的要解析的element元素、element元素的路径xpath、以及element元素节点名称;转到步骤(3.2);
步骤(3.8):对该元素的子节点进行遍历,获取元素节点element、元素节点名称、设置节点的xpath,如果子节点名称是element,则转到步骤(3.9);如果子节点名称是attribute,则转到步骤(3.10);
步骤(3.9):对子节点名称为element的元素进行处理,根据子节点的name、type、ref属性值,确定新的要解析的element元素、element元素的路径xpath、以及element元素节点名称;将当前的element元素添加到xsl文档中,节点的标签是<apply-templates>,父节点是elementtemplate;转到步骤(3.2);
步骤(3.10):对子节点名称为attributet的元素进行处理,并添加到xsl文档中,节点的标签是<value-of>,父节点是elementtemplate;转到步骤(3.2)。
本发明的有益效果在于:
本发明通过分析xmlschema文档和xsl文档之间的关系,确定xmlschema文档中需要关注的元素并映射到xsl文档中,从而生成xsl文档的模板,用户只需要依据呈现的不同格式,在生成的xsl文档模板中添加一些html标签,就可以完成xsl文档的编辑,从而降低了xsl文档编辑的复杂度,并提高编辑的效率,并且生成的xsl文档支持基于该xmlschema生成的所有xml文档,通过引用该的xsl文档可以使xml文件呈现不同格式,使得xml文档易于阅读。
具体实施方式
下面结合实施例对本发明作进一步说明:
实施例:
一种将xmlschema文档转换为xsl文档的方法,包括以下步骤:
步骤1:先确定xmlschema标准定义中需要关注的元素,然后确定xmlschema标准定义的元素和xsl标准定义的元素之间的映射关系;本步骤具体包括以下步骤:
步骤(1.1):确定xmlschema标准定义中需要关注的元素包括但不限于以下元素:<xs:elment>元素及其name、type和ref属性;<xs:group>元素;<xs:attribute>元素及其ref属性;<xs:complextype>元素;
步骤(1.2):确定xmlschema标准定义的元素和xsl标准定义的元素之间的映射关系,具体为:<xs:elment>映射为<xsl:template>,并使用match属性关联xml元素和模板;/element/element之间的父子关系映射为template/apply-templates,并使用<apply-templates>的select属性,表示仅处理匹配该属性的值的子元素;<xs:attribute>映射为<xsl:value-of>,用于提取某个选定节点的值;/element/attribute映射为/template/value-of;
步骤2:对xmlschema文档进行解析,获取schema标准中需要关注的第一个元素,并添加到xsl文档中;本步骤具体包括以下步骤:
步骤(2.1):创建xsl文档,并添加域名和版本信息;
步骤(2.2):读取xmlschema文档,获取document对象和根节点;
步骤(2.3):对根节点的子节点进行遍历,获取当前的子节点;
步骤(2.4):如果子节点的名称是element,那么解析节点的type、name和ref属性;
步骤(2.5):根据type、name和ref的值,确定需要关注的第一个元素的名称,并将该元素添加到xsl文档中;本步骤具体方法如下所示:
将关注的第一个元素dmodule作为<xsl:template>的子节点:
<xsl:templatematch="/">
<xsl:apply-templatesselect="dmodule"/>
</xsl:template>
match="/",用于定义整个文档;
步骤3:按照深度优先原则依次对xmlschema文档中的<schema>的子节点中的<element>元素进行解析,查找xmlschema中需要关注的元素并添加到xsl文档中,直到完成整个xmlschema文档的转换;本步骤具体包括以下步骤:
步骤(3.1):根据子节点的name、type、ref属性值,确定新的要解析的element元素、element元素的路径xpath、以及element元素节点名称;
步骤(3.2):获取该element元素节点迭代器;
步骤(3.3):根据element元素节点的名称参数,设置当前正在解析的element元素elementtemplate、以及正在解析的element元素节点的名称;
步骤(3.4):判断该element元素是否是叶子节点,如果是,则转到步骤(3.5);如果不是叶子节点,则转到步骤(3.8);
步骤(3.5):判断element元素节点的名称是否是element,如果是,则转到步骤(3.6);如果不是element,则转到步骤(3.7);
步骤(3.6):获取element元素节点的name、type属性值,并根据name和type的值是否为空,判断是否给elementtemplate元素添加子节点value-of;
步骤(3.7):对节点的ref属性值不为空的元素进行处理,确定新的要解析的element元素、element元素的路径xpath、以及element元素节点名称;转到步骤(3.2);
步骤(3.8):对该元素的子节点进行遍历,获取元素节点element、元素节点名称、设置节点的xpath,如果子节点名称是element,则转到步骤(3.9);如果子节点名称是attribute,则转到步骤(3.10);
步骤(3.9):对子节点名称为element的元素进行处理,根据子节点的name、type、ref属性值,确定新的要解析的element元素、element元素的路径xpath、以及element元素节点名称;将当前的element元素添加到xsl文档中,节点的标签是<apply-templates>,父节点是elementtemplate;转到步骤(3.2);
步骤(3.10):对子节点名称为attributet的元素进行处理,并添加到xsl文档中,节点的标签是<value-of>,父节点是elementtemplate;转到步骤(3.2)。
更具体地,上述步骤1和步骤2采用dom4j解析xml的主要过程为:
saxreadersaxreader=newsaxreader();
documentdoc=saxreader.read(xsd);//读取xml文件,获得document对象
elementroot=doc.getrootelement();//获得根节点
documentxsldoc=documenthelper.createdocument();//创建xsl文档对象for(iteratori=root.elementiterator();i.hasnext();){//获取根节点的所有子节点
elementelement=(element)i.next();//或得节点
……}//遍历节点
elementchild=elementtemplate.addelement(xxx);//在节点elementtemplate下添加子节点
child.addattribute(xxx);//为child添加属性
xmlwriterwriter=newxmlwriter(newfilewriter("xsl.xsl"),format);
writer.write(document);
writer.close();//将文档写入xml文件
xmlschema标准定义中需要关注的元素包括:<xs:elment>元素及其name、type和ref属性;<xs:group>元素;<xs:attribute>元素及其ref属性;<xs:complextype>元素等;
xmlschema标准定义的元素和xsl标准定义的元素之间的映射关系:
a)<xs:elment>映射为<xsl:template>;
b)/element/element之间的父子关映射为template/apply-templates;
c)<xs:attribute>映射为<xsl:value-of>;
d)/element/attribute映射为/template/value-of。
上述实施例只是本发明的较佳实施例,并不是对本发明技术方案的限制,只要是不经过创造性劳动即可在上述实施例的基础上实现的技术方案,均应视为落入本发明专利的权利保护范围内。