infopath模板介绍
在infopath中,模板文件定义了infopath表单的数据、行为和显示等三方面的信息。这些信息不是存储在一个文件中,而是分别存

放的。主要的文件有:
manifest.xsf是工程文件,定义了模板中包含哪些文件,它们定义那类信息,以及data connect的信息。相当于Visual Studio中的

项目工程文件。
myschema.xsd,sampledata.xml,template.xml三个文件都是定义的infopath中的datasource。其中myschema.xsd是一个schema文

件,定义了datasource的数据结构和每个数据节点的数据类型。template.xml是根据myschema.xsd产生的一个空的xml数据文件。

sampledata.xml没有仔细研究,应该记录了预定义的数据默认值。
view1.xsl是定义如何显示数据的,是标准的xsl文件。
upgrade.xsl则记录版本信息,用于版本比较和版本升级。
除了这些基本文件,如果在infopath中加入script脚本或managed code代码如c#代码。这些脚本文件或代码编译后的dll文件也要包

含在模板中。

如果了解了infopath模板的定义方式,我们就可以用程序直接修改模板,在有些情况下,这是非常方便的。例如,你已经发布了上

百个各种infopath模板,它们都有同样的对某个web service的数据连结。现在,web services的地址变化了,如果手工修改,工作

量可想而知。
在InfoPath Team Blog上有文章专门讲解如何使用脚本方式来修改infopath模板

http://blogs.msdn.com/infopath/archive/2004/05/04/126147.aspx)。
基本的处理方式是
第一步: 将XSN文件解包到一个临时目录下。
第二步: 用xml方式打开manifest.xsf等定义文件,修改其内容
第三步: 将文件重新打包成xsn文件

第一步:
从MSDNs下载MicrosoftCabinet 软件开发工具包,http://support.microsoft.com/kb/310618。里面包含了我们需要的解包和打包工

具。里面包含多个微软文件打包工具,其中我们会用到extract.exe和cabarc.exe。
解包的命令行指令: extract.exe /y /e template1.xsn /l template 
template1.xsn是要解包的xsn文件名,/l template 表示解开后的文件放在子目录template 下面。
MicrosoftCabinet软件开发工具包也提供了dll和API,你可以把它加入你的工程,然后直接调用API来完成同样的操作。

第二步:修改infopath模板
这里把每个文件要修改的部分简单地说明
1) manifest
<xsf:xDocumentClass>节点是根节点,如果要修改模板文件的名字,需要修改这个节点的name属性
name="urn:schemas-microsoft-com:office:infopath:Template1:-myXSD-2006-12-17T09-42-45"中Template1是模板文件的名字,改成你自己的名字就好。
<xsf:fileNew><xsf:initialXmlDocument caption="Template1" href="template.xml"></xsf:initialXmlDocument>
</xsf:fileNew>节点也需要修改caption属性,注意,别修改href="template.xml"(这是文件引用,指向template.xml的)。
2)myschema
如果要修改datasource,如增加几个数据field或group,主要工作就是修改这个文件。这是一个标准的XML的schema,需要你非常熟悉schema的格式。下面是一个infopath的schema内容
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema targetNamespace="http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-12-17T09:42:45" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-12-17T09:42:45" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:element name="WorkflowData">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element ref="my:WorkflowName" minOccurs="0"/>
    <xsd:element ref="my:WorkflowGUID" minOccurs="0"/>
    <xsd:element ref="my:WorkflowStep1" minOccurs="0"/>
   </xsd:sequence>
   <xsd:anyAttribute processContents="lax" namespace="http://www.w3.org/XML/1998/namespace"/>
  </xsd:complexType>
 </xsd:element>
 <xsd:element name="WorkflowName" type="xsd:string"/>
 <xsd:element name="WorkflowGUID" type="xsd:string"/>
 <xsd:element name="WorkflowStep1">
  <xsd:complexType>
   <xsd:sequence/>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>
例如,你要为WorkflowData增加一个author的field,数据类型为text.修改后的内容为
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema targetNamespace="http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-12-17T09:42:45" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-12-17T09:42:45" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:element name="WorkflowData">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element ref="my:WorkflowName" minOccurs="0"/>
    <xsd:element ref="my:WorkflowGUID" minOccurs="0"/>
    <xsd:element ref="my:WorkflowAuhtor" minOccurs="0"/>
    <xsd:element ref="my:WorkflowStep1" minOccurs="0"/>
   </xsd:sequence>
   <xsd:anyAttribute processContents="lax" namespace="http://www.w3.org/XML/1998/namespace"/>
  </xsd:complexType>
 </xsd:element>
 <xsd:element name="WorkflowName" type="xsd:string"/>
 <xsd:element name="WorkflowGUID" type="xsd:string"/>
 <xsd:element name="WorkflowAuhtor" type="xsd:string"/>
 <xsd:element name="WorkflowStep1">
  <xsd:complexType>
   <xsd:sequence/>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>

3)template
这个文件比较简单,就是一个没有数据的空白infopath文件。如果你修改了datasource,这里也要同样作修改。
4) sampledata
5) view1
这是一个xslt文件,用来把xml数据格式化输出到infopath中显示。如果你熟悉xslt和HTML,修改这个文件也很容易。
需要注意的是,如果你在infopath中定义了多个view,如有View1,view2两个view,则xsn中会有两个文件:view1.xsl,view2.xsl。


第三步:当所有的模板文件都修改完成后,我们可以使用cabarc.exe来重新打包xsn
打包命令: cabarc.exe  n template1.xsn template/*.*
template1.xsn是产生的模板文件的名字,template/*.*是指定将template所有文件打包
。 

posted on 2007-05-24 14:28  Dragon-China  阅读(2218)  评论(0编辑  收藏  举报