是否可以创建schematron程序集,就像我们可以将.xsd模式编译成程序集并部署到Biztalk或其他应用程序(使用BTSCompile构建操作)一样?
例如,我们有一个从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 Build Action进行编译,这是我假设需要能够“看到”程序集中的模式。
我正在使用的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 :(得分:1)
您可以通过使用xs:annotation元素(如Microsoft为BizTalk flat file schemas所做的那样)在XML架构中嵌入schematron规则。这将允许您将schematron规则编译为BizTalk程序集。可以在this older MSDN article中找到示例模式。
但是,BizTalk将忽略注释。如果你想使用这些规则,你需要告诉BizTalk如何做到这一点。您可以编写自定义管道组件来执行schematron验证,可能依赖于the Schematron.net library。或者您可以使用开源管道组件,例如the Schematron XmlValidator Pipeline Component for BizTalk(我自己没有使用它)。如果你想编写一个验证整个xml文档的管道组件(而不是像第一个错误那样失败,就像默认的XML Validation组件一样),看看Saravana Kumar的blog post on the matter。