企业会计标准接口数据在审计实务中的采集和处理
吴进 陈宇(审计署成都特派办)
【发布时间:2010年10月29日】
字号:【大】 【中】 【小】
随着被审计单位信息化程度的日益提高,计算机数据分析已经成为了审计中不可缺少的一个重要步骤,而数据采集作为计算机数据分析的基础在重要性不断提升的同时也面临着更大的挑战,尤其是异构数据库使得各个企业之间的数据难以采集和交换。近些年,随着可扩展置标语言(eXtensible Markup Language, XML)的广泛使用,使得数据交换标准化成为可能。2010年6月24日,国家标准化管理委员会批准发布了最新的《财经信息技术 会计核算软件数据接口 第1部分:企业》(GB/T 24589.1—2010),用XML规范了会计核算软件数据接口,各大会计软件公司都将在短时间内提供对新标准的支持,审计署办公厅也于2010年8月发出了关于学习贯彻企业和行政事业单位会计核算软件数据接口国家标准的通知(审办计发〔2010〕187号)。然而,新标准的实施也使得审计实务面临了新的问题:如何有效地根据XML Schema文件的定义采集和处理XML数据,如何将企业会计标准接口的数据导入Access以及现场审计实施系统(以下简称“AO”)中。本文对Access对XML Schema支持的局限性进行了分析,并讨论了如何利用可扩展样式表语言转换(Extensible Stylesheet Language Transformations,XSLT)技术将企业会计标准接口数据的XML Schema文件转换为与Access兼容的Schema文件,进而探讨了将XML数据按照新的XML Schema导入Access以及AO系统的方法,对审计实务中有效地采集和处理最新的企业会计标准接口提供了帮助。

一、 XML和XML Schema简介

XML是由互联网协作组织(World Wide Web Consortium,W3C)开发的,其标准最早于1998年2月发表,我国也制定了相应的标准GB/T 18793—2002 《信息技术 可扩展置标语言(XML)1.0》。一个典型的XML文件如下:

<图书 noNamespaceSchemaLocation="First.xsd">
    9787115226914
    <名称>数学分析八讲
    <作者>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 Schema中,定义了四个元素(element):图书、ISBN、名称和作者,其中“图书”为根元素,后三个元素必须依次出现,且规定了其类型为字符串类型(xs:string),最大长度分别为15、60和20。根据这个Schema将XML数据文件导入Access关系数据库时,就不会简单地将所有元素都识别为最大长度为255的字符串类型,而是会根据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>

</xs:element> 

而Access不支持“电子账簿编号”元素中的 以及属性locID的声明。
解决方案:利用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文件中的 元素删除,再将“标准数据元素类型.xsd”文件的内容复制到所有引用它的文件头部,这样,这些XSD文件就不必再引用“标准数据元素类型.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文件中,元素将“标准数据元素类型.xsd”文件中的所有标准数据元素类型定义复制到了目标代码中,而元素只是将<公共档案>元素进行了复制,其余的 模板元素,则在复制数据元素定义时,将原数据元素类型定义的复杂类型,修改成了直接引用具有简单类型定义的标准数据元素类型,从而满足了XML Schema数据导入Access中的条件。
该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的插件,方便审计人员的使用。

【关闭】    【打印】