跳轉到內容

XRX/子集生成器

來自華夏公益教科書,開放書籍,開放世界
< XRX

您有多個 XML 文件,並且希望所有共享資料元素的語義和業務規則都由單個模型驅動。

我們將使用兩種型別的 XML 模式。語義模式子集模式是文件交換中所有元素的序列,包括元素列舉值的含義。約束模式交換模式將匯入語義模式,幷包含文件約束,例如元素的順序、分組和每個元素的基數。

我們將利用許多ISO/IEC 11179 元資料登錄檔的概念。我們將使用一個單一的 XQuery,它接收一個需求清單並從該登錄檔中生成一個語義子模式。這確保了 XML 模式族中的所有葉級元素都具有一致的資料型別和精確的語義定義,這些定義都引用回元資料登錄檔。從中央資料模型自動生成結構稱為模型驅動設計。

子集生成背景

[編輯 | 編輯原始碼]

子集生成技術最初由佐治亞理工學院開發,以支援GJXDMNIEM 標準。這些工具採用網站的形式,允許使用者在登錄檔中挑選資料元素,並將這些資料元素列表儲存在名為需求清單的檔案中。然後使用該需求清單生成 GJXDM 系統的子集,該子集保證與 GJXDM 一致。這些工具被用於國家資訊交換模型以及明尼蘇達州稅務部門的子模式生成器。

子集生成器是三步過程的第二步。

  • 第一步:使用元資料購物車在您的登錄檔中挑選資料元素,並建立一個需求清單。具有整合搜尋功能的購物車工具允許非程式設計師積極參與模式建立。
  • 第二步:是使用第一步中生成的作為輸入的需求清單,生成一個符合里氏替換原則子集模式
  • 第三步:將該子集 XML 模式匯入到約束模式中。這可以透過直接在匯入中引用指向需求清單的 REST 引數來完成,也可以透過將子集儲存到一個單獨的檔案中來完成。

需求清單

[編輯 | 編輯原始碼]

需求清單是您將在 XML 模式中的葉元素處放置的所有資料元素的簡單列舉。需求清單不包含任何基數(重複次數)或複雜的分支結構。它們就像您去購物時拿的購物清單,清單上沒有指定商品的數量。

GTRI 需求清單 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 的子模式生成器

[編輯 | 編輯原始碼]

該 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>
)

使用 XML 模式驗證您的 XForms

[編輯 | 編輯原始碼]

一些 XForms 系統允許您使用 XML 模式來驗證您的表單。例如,使用 Orbeon 表單,您可以執行以下操作

<xf:model schema="MyTypeLibrary.xsd">

上一步: 元資料購物 下一步: XForms 生成器

華夏公益教科書