2

.xsd スキーマをアセンブリにコンパイルし、Biztalk またはその他のアプリケーションに (BTSCompile ビルド アクションを使用して) 展開するのと同じ方法で、schematron アセンブリを作成することは可能ですか?

たとえば、HL7v3 スキーマから構築された通常のアセンブリがあり、スキーマをアセンブリから 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;
    }

ただし、スキーマトロンに対して同じことをしようとすると、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 スキーマにあまり精通していないので、見落としている単純なものかもしれません。

4

1 に答える 1

1

xs:annotation 要素を使用して XML スキーマ内にスキーマトロン ルールを埋め込むことができます (Microsoft がBizTalk フラット ファイル スキーマに対して行っているように)。これにより、schematron ルールを BizTalk アセンブリにコンパイルできます。スキーマの例は、この古い MSDN 記事にあります。

ただし、BizTalk は注釈を無視します。これらのルールを利用したい場合は、BizTalk にその方法を伝える必要があります。

おそらくSchematron.net ライブラリに依存して、スキーマトロンの検証を行うカスタム パイプライン コンポーネントを作成できます。または、BizTalk 用の Schematron XmlValidator パイプライン コンポーネントのようなオープン ソース パイプライン コンポーネントを使用することもできます(私自身は使用していません)。XML ドキュメント全体を検証するパイプライン コンポーネントを作成する場合は (既定の XML 検証コンポーネントのように最初のエラーで失敗するのではなく)、この問題に関する Saravana Kumar のブログ投稿を参照してください。

于 2012-11-28T20:23:53.607 に答える