XRX/子集生成器
您有多个 XML 文档,并且希望所有共享数据元素的语义和业务规则都由单个模型驱动。
我们将使用两种类型的 XML 模式。语义模式或子集模式是文档交换中所有元素的序列,包括元素枚举值的含义。约束模式或交换模式将导入语义模式,并包含文档约束,例如元素的顺序、分组和每个元素的基数。
我们将利用许多ISO/IEC 11179 元数据注册表的概念。我们将使用一个单一的 XQuery,它接收一个需求清单并从该注册表中生成一个语义子模式。这确保了 XML 模式族中的所有叶级元素都具有一致的数据类型和精确的语义定义,这些定义都引用回元数据注册表。从中央数据模型自动生成结构称为模型驱动设计。
子集生成技术最初由佐治亚理工学院开发,以支持GJXDM和NIEM 标准。这些工具采用网站的形式,允许用户在注册表中挑选数据元素,并将这些数据元素列表保存在名为需求清单的文件中。然后使用该需求清单生成 GJXDM 系统的子集,该子集保证与 GJXDM 一致。这些工具被用于国家信息交换模型以及明尼苏达州税务部门的子模式生成器。
子集生成器是三步过程的第二步。
- 第一步:使用元数据购物车在您的注册表中挑选数据元素,并创建一个需求清单。具有集成搜索功能的购物车工具允许非程序员积极参与模式创建。
- 第二步:是使用第一步中生成的作为输入的需求清单,生成一个符合里氏替换原则的子集模式。
- 第三步:将该子集 XML 模式导入到约束模式中。这可以通过直接在导入中引用指向需求清单的 REST 参数来完成,也可以通过将子集保存到一个单独的文件中来完成。
需求清单是您将在 XML 模式中的叶元素处放置的所有数据元素的简单枚举。需求清单不包含任何基数(重复次数)或复杂的分支结构。它们就像您去购物时拿的购物清单,清单上没有指定商品的数量。
以下是使用美国NIEM元数据购物车工具生成的示例需求清单。不仅指定了三部分属性(对象类、属性、表示术语),而且 isReference 指示器也可用。
<?xml version="1.0" encoding="UTF-8"?>
<w:WantList xmlns:w="http://niem.gov/niem/wantlist/1" w:release="2.0" w:product="NIEM">
<w:Element w:prefix="nc" w:name="LocationCityName" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="LocationCounty" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="LocationCountyCode" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="LocationPostalCode" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="LocationStateFIPS5-2AlphaCode" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="LocationStateName" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="LocationStateUSPostalServiceCode" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="StreetCategoryText" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="StreetExtensionText" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="StreetFullText" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="StreetName" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="StreetNumberText" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="StreetPostdirectionalText" w:isReference="false"/>
<w:Element w:prefix="nc" w:name="StreetPredirectionalText" w:isReference="false"/>
</w:WantList>
该需求清单可以从 Web 购物车工具保存到您的本地文件系统,然后在以后重新加载。在我们的示例中,任何需求清单都可以保存在 eXist 服务器上,并作为参数传递给子集生成器。这允许开发人员除了其他 XML 模式组件之外,还可以重用和版本化需求清单。
该 XQuery 以存储在需求清单集合中的需求清单文件名作为单个参数。它遍历需求清单中的每个元素并生成相应的 XML 模式类型。
查询的 URL 格式为
[WEBSERVER]/db/wantlists/subset.xq?wantlist=WANTLISTNAME
在这种情况下,可以省略 .xml 文件扩展名。
xquery version "1.0";
import module namespace mdr = "http://mdr.example.com" at "/db/mdr/modules/mdr.xq";
declare namespace exist = "http://exist.sourceforge.net/NS/exist";
declare namespace xsd = "http://www.w3.org/2001/XMLSchema";
declare namespace system="http://exist-db.org/xquery/system";
declare namespace request="http://exist-db.org/xquery/request";
declare option exist:serialize "method=xhtml media-type=text/xml indent=yes";
let $wantlist := request:get-parameter('wantlist', '')
return
if (string-length($wantlist) < 1)
then (
<results>
<message>Error: "wantlist" is a required parameter.</message>
</results>
)
else (
let $wantlist-collection := '/db/mdr/wantlists/data'
let $file-path := concat($wantlist-collection, '/', $wantlist, '.xml')
let $doc := doc($file-path)
return
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:e="http://metadata.example.com"
targetNamespace="{$doc//NamespaceURI/text()}">
<xsd:annotation>
<xsd:documentation>
<wantlist>{$wantlist}</wantlist>
<path>{$file-path}</path>
</xsd:documentation>
</xsd:annotation>
{for $element in $doc//Element
let $prefix := 'p:'
let $simpleType :=
if (ends-with($element, 'Code'))
then
(<xsd:simpleType name="{concat($element/text(), 'Type')}">
<xsd:annotation>
<xsd:documentation>{mdr:get-definition-for-element($element)}</xsd:documentation>
</xsd:annotation>
{mdr:get-restrictions-for-element($element/text())}
</xsd:simpleType>
)
else ()
let $elementDef := <xsd:element name="{$element/text()}"
type="{if (ends-with($element, 'Code'))
then (concat($prefix, $element/text(), 'Type'))
else (mdr:get-xml-schema-datatype-for-element($element))}" nillable="true">
<xsd:annotation>
<xsd:documentation>{mdr:get-definition-for-element($element)}</xsd:documentation>
</xsd:annotation>
</xsd:element>
return ($simpleType, $elementDef)
}
</xsd:schema>
)
一些 XForms 系统允许您使用 XML 模式来验证您的表单。例如,使用 Orbeon 表单,您可以执行以下操作
<xf:model schema="MyTypeLibrary.xsd">