一、 XML和XML Schema简介
XML是由互联网协作组织(World Wide Web Consortium,W3C)开发的,其标准最早于1998年2月发表,我国也制定了相应的标准GB/T 18793—2002 《信息技术 可扩展置标语言(XML)1.0》。一个典型的XML文件如下:
<图书 noNamespaceSchemaLocation="First.xsd">
<名称>数学分析八讲
<作者>A.Я.辛钦
XML类似HTML,由许多不同的标记以及标记中的元素和属性构成,但XML实现了数据、结构和显示方式的分离。在XML中,数据存放于XML数据文件中,而结构存放在XML Schema文件中,显示方式则保存在可扩展样式表语言(eXtensible Stylesheet Language, XSL)文件中。
XML Schema是按照XML语法,以一定的规则来表示特定XML文件结构的方法。XML Schema文件一般以“XSD”作为文件名后缀,因此又被称为XSD文件。XML Schema是由W3C提出的,用来替代原有的文件类型定义(Document Type Definition,DTD)的新的标准。XML Schema允许把一个元素说明为一个integer、float、boolean、URL等类型,使得XML文件可以和关系数据库的字段进行对应和转换,大大方便了XML语言的处理。
针对上面的XML文件,一个定义其结构的XML Schema文件如下所示:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="图书">
<xs:complexType>
<xs:sequence>
<xs:element name="ISBN">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="15"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="名称">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="60"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="作者" type="xs:string">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
二、 企业会计标准接口中的XML数据和XML Schema
根据《财经信息技术 会计核算软件数据接口 第1部分:企业》(GB/T 24589.1—2010)的规定,企业会计标准接口的XML数据元素共分为五大类:即公共档案类、总账类、应收应付类、固定资产类以及员工薪酬类,各类数据元素之下又有若干张数据表,例如公共档案类数据元素就包含电子账簿、会计期间、记账凭证类型等12张表;而相应的XML Schema文件共有五个,每一种数据元素对应一个XSD文件,另外还有一个XSD文件定义了基本的数据类型,供其余5个数据文件引用。XML和XSD文件的对应关系如图1所示:
图1 企业会计标准接口的XML数据文件和XML Schema关系图
三、 Access对XML Schema支持的局限性及解决方案
Microsoft Access是审计人员最常用的关系数据库之一,AO客户端也是以Access数据库为后台编写的。然而,Access对XML Schema的支持却非常有限,使得企业会计标准接口的XML数据文件难以根据其XML Schema导入Access数据库,进而也难以用AO客户端进行数据采集,给审计人员进行下一步的数据分析造成了极大的不便。
经过分析和研究,我们发现Access对XML Schema的支持主要有以下三个局限,并对每一个局限提出了解决方案。
(一)局限:Access导入元素字段时,不支持带有属性值的复杂类型元素,仅支持简单类型元素。
例如,在“公共档案.xsd”文件中,“电子账簿编号”元素是这样定义的:
<xs:element name="电子账簿编号">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="电子账簿编号类型">
<xs:attribute ref="locID" use="optional" fixed="010101"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
而Access不支持“电子账簿编号”元素中的
解决方案:利用XSLT将XSD文件中所有复杂元素类型转换为简单类型元素,针对上面的“电子账簿编号”复杂类型元素,转换后的简单类型元素如下所示:
<xs:element name="电子账簿编号" type="电子账簿编号类型"/>
(二)局限:Access不支持xsd文件中的
上文提到,在企业会计标准接口的所有XSD文件中,有一个XSD文件(标准数据元素类型.xsd)定义了基本的数据类型,供其余5个数据文件引用。其语法如下:
<xs:schema>
<xs:include schemaLocation="标准数据元素类型.xsd"/>
</xs:schema>
然而,Access并不支持include元素,因此也不能支持在一个XSD文件中引用另一个XSD文件。
解决方案:利用XSLT将原XSD文件中的
(三)局限:Access不支持xml数据文件中根元素的schemaLocation属性,仅支持noNamespaceSchemaLocation属性。
企业会计标准接口导出的数据的XML数据文件中,都用schemaLocation属性指向相应XSD元素,例如“公共档案类.xml”中对“公共档案类.xsd”的引用如下:
<公共档案 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://sxbw.audit.gov.cn/AccountingSoftwareDataInterfaceStandard/2010/SOE/XMLSchema 公共档案.xsd">
然而Access并不支持schemaLocation属性。
解决方案:将对应的XSD文件和XML数据文件放在同一个文件夹内,并用noNamespaceSchemaLocation修改上述引用,如下所示:
<公共档案 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="公共档案.xsd">
四、 利用XSLT转换XML Schema
XSLT是一种将XML转换为HTML 文档或其他 XML 文档的语言,由于XML Schema对应的XSD文件实质上就是一种特殊的XML文件,因此,我们也可以用XSLT技术将其转换为Access支持的新的XSD文件。针对上节提到的Access对XML Schema支持的三点局限以及解决方案,我们设计了如下的XSLT文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" version="1.0" encoding="UTF-8" omit-xml-declaration="no" indent="yes"/>
<xsl:template match="/xs:schema">
<xsl:copy>
<xsl:for-each select="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
<xsl:comment>将“标准数据元素类型.xsd”的内容复制进来:</xsl:comment>
<xsl:copy-of select="document(‘标准数据元素类型.xsd')/*/*"/>
<xsl:comment>公共档案定义:</xsl:comment>
<xsl:copy-of select="/xs:schema/xs:element[@name='公共档案']"/>
<xsl:comment>公共档案数据表定义修订:</xsl:comment>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="/xs:schema/xs:element[@name!='公共档案']">
<xsl:copy>
<xsl:attribute name="name">
<xsl:value-of select="./@name"/>
</xsl:attribute>
<xsl:element name="xs:complexType">
<xsl:element name="xs:sequence">
<xsl:apply-templates/>
</xsl:element>
</xsl:element>
</xsl:copy>
</xsl:template>
<xsl:template match="/xs:schema/xs:element[@name!='公共档案']/xs:complexType/xs:sequence">
<xsl:for-each select="*">
<xsl:copy>
<xsl:for-each select="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
<xsl:attribute name="type">
<xsl:value-of select="*/*/*/@base"/>
</xsl:attribute>
</xsl:copy>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
在上面XSLT文件中,元素
该XSLT文件虽然是针对“公共档案.xsd”文件进行的转化,但却具有普遍适用的价值。如需要对其它几个XSD文件进行转换,只需要将文件中的所有“公共档案”替换为相应的其它数据元素名,例如“固定资产类”、“应收应付类”即可。
五、 获得转换后的XSD文件
通过XSLT转换后,可以在浏览器中看到效果,但却无法保存转换后的目标代码,为此,我们使用Java程序设计语言开发了一个简单的程序,实现了XSD文件的转换并保存,其界面如图2所示:
图2 转换程序界面
如图2所示,我们可以在前两个文本框中指定待转换的XSD文件以及转换所需的XSLT文件,在最下面一个文本框中给定生成的新XSD文件,点击“开始转换”即可完成转换。转换程序的核心代码如下:
public void XSDTransform(String source, String style, String dest) throws TransformerException
{
StreamSource input = new StreamSource(new File(source));
StreamSource stylesheet = new StreamSource(new File(style));
StreamResult output = new StreamResult(new File(dest));
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(stylesheet);
transformer.transform(input, output);
}
六、 将转换后的数据导入Access及AO
将转换后的XSD文件及XML数据文件放在同一个文件夹内,使用Access的“获取外部数据”功能,就可以导入企业会计标准接口的数据,如图3所示:
图3 将数据导入Access
如图3所示,使用转换后的XSD文件,Access就能正确地识别XML数据文件中的每一张表,以及每张表的每一个字段名及其字段数据类型,将其导入Access后,就可以使用AO中的“数据采集”功能,将Access中的数据作为业务数据采集进来,供审计人员进行查询和分析。
七、 结论及今后的工作
随着《财经信息技术 会计核算软件数据接口 第1部分:企业》(GB/T 24589.1—2010)的发布和实施,审计人员在今后的工作中将会面对大量基于该接口的XML数据。本文分析和讨论了审计人员现有的基于Access的AO系统对新的标准接口支持的局限性,并提出了相应的解决方案,为审计人员正确的采集和分析基于新的标准接口的数据打下了基础。
今后,我们将致力于开发更自动化、更智能的转换程序,并有可能作为AO的插件,方便审计人员的使用。
【关闭】 【打印】 |