2012-11-15 87 views
2

是否可以創建schematron程序集,就像我們可以將.xsd模式編譯爲程序集並將其部署到Biztalk或其他應用程序一樣(使用BTSCompile構建操作) ?是否可以將schematron模式編譯爲Biztalk程序集

例如,我們有一個從HL7v3模式構建的常規程序集,我有一個應用程序從程序集中加載Schema作爲XmlSchema,並使用它來驗證XML。在這種情況下它工作正常。

這裏有一個什麼我談論的基本思想:

public static XmlSchema LoadSchema(System.Type schemaType) 
    { 
     if (schemaType == null) 
     { 
      throw new NullReferenceException("schemaType cannot be null. Pass a valid object type."); 
     } 

     XmlSchema schema = new XmlSchema(); 

     try 
     { 
      // Grabbing an Assembly that is loaded for the type we're after. 
      Assembly schemaAssembly = Assembly.GetAssembly(schemaType); 
      foreach (Type type in schemaAssembly.GetTypes()) 
      { 
       if (typeof(SchemaBase).IsAssignableFrom(type) && !type.IsNested && type.Name == schemaType.Name) 
       { 
        schema = (Activator.CreateInstance(type) as SchemaBase).Schema; 
        break; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new Exception("Could not Load Schema assembly.", ex); 
     } 

     return schema; 
    } 

但是,如果我嘗試了Schematron的做同樣的我不能讓它使用BTSCompile生成操作而這正是編譯我假設需要能夠「查看」程序集中的模式。

我使用的Schematron的文件基本上是這樣,現在:

<?xml version="1.0" encoding="utf-8"?> 
<schema xmlns="http://www.ascc.net/xml/schematron" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.ascc.net/xml/schematron http://www.ascc.net/xml/schematron/schematron1-5.xsd" xmlns:hl7="urn:hl7-org:v3"> 

<title>Schematron Rule Definitions</title> 
<ns uri="urn:hl7-org:v3" prefix="hl7"/> 
<ns uri="http://www.w3.org/2001/XMLSchema-instance" prefix="xsi"/> 
<!-- Rules that pertain to multiple sections of the CDA --> 
<pattern name="Header - Test"> 
    <rule context="/"> 
     <assert test="hl7:ClinicalDocument"> 
      ClinicalDocument must be the root node with the namespace urn:hl7-org:v3. 
     </assert> 
    </rule> 
    </pattern> 
</schema> 

在編譯的時候我收到的錯誤是:

The root element of a W3C XML Schema should be <schema> and its namespace should be 'http://www.w3.org/2001/XMLSchema'.

所以,後來當我做它當然說:

The 'title' element is not supported in this context

,因爲它們不是有效的xml模式元素。所以現在我的問題是這樣的:有沒有辦法做我想在這裏做的事情?我對XML Schema不太熟練,所以它可能是我忽略的一些簡單的東西。

+0

我重新啓動了XRouter SchemaTron並添加了XPath2/XSLT2支持。查看https://github.com/gap777/SchemaTron – gap

回答

1

您可以通過使用xs:annotation元素(如Microsoft爲BizTalk flat file schemas)將schematron規則嵌入到XML模式中。這將允許您將schematron規則編譯到BizTalk程序集中。示例模式可以在this older MSDN article中找到。

但是,BizTalk將忽略註釋。如果你想使用這些規則,你需要告訴BizTalk如何做到這一點。

您可以編寫自定義管道組件來執行schematron驗證,可能依賴於the Schematron.net library。或者你可以使用開源的管道組件,如the Schematron XmlValidator Pipeline Component for BizTalk(我自己並沒有使用它)。如果您想編寫一個驗證整個xml文檔的管道組件(與第一個錯誤不同,就像默認的XML驗證組件一樣),請看看Saravana Kumar的blog post on the matter

+1

我最終做到了嵌入式資源路由 - 因爲Biztalk本身並不需要引用,而是一個輔助類。在我發現了XRouter schematron庫[link](https://www.assembla.com/spaces/xrouter/wiki)之後,它比Schematron.net庫(在這一點上變得相當老舊) )。 Xrouter庫使用嵌入式資源(schematron文件),這比我以前的方式更適合我們的實現。 – Bensonius

相關問題