ワイルドカード コンポーネントと内容検証
ワイルドカード コンポーネントは、コンテンツ モデルで使用できる表現の柔軟性を高めるために使用されます。ワイルドカード コンポーネントは、次のように XSD 言語でサポートされています。
要素ワイルドカード コンポーネント。これらは <xsd:any> 要素で表現されます。
属性ワイルドカード コンポーネント。これらは <xsd:anyAttribute> 要素で表現されます。
両方のワイルドカード文字要素 (<xsd:any> および <xsd:anyAttribute>) で processContents 属性を使用できます。この属性を使用して、ワイルドカード文字要素で関連付けられるドキュメントの内容の違反を、XML アプリケーションで検証する方法を示す値を指定できます。検証方法を示す値には、次のようにそれぞれ異なる効果があります。
strict 値は、内容を完全に検証することを指定します。
skip 値は、内容を検証しないことを指定します。
lax 値は、スキーマ定義が有効な要素と属性だけを検証することを指定します。
lax 検証と xs:anyType 要素
XML スキーマの仕様では、anyType 型の要素には lax 検証が使用されています。SQL Server 2005 では lax 検証をサポートしていなかったので、anyType 型の要素にも strict 検証が適用されていました。SQL Server 2008 からは lax 検証がサポートされるようになったため、anyType 型の要素の内容は lax 検証を使用して検証されます。
次の例は、lax 検証を示しています。スキーマ要素 e は anyType 型です。この例では、型指定された xml 変数を作成し、anyType 型の要素の lax 検証を示します。
CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://ns">
<element name="e" type="anyType"/>
<element name="a" type="byte"/>
<element name="b" type="string"/>
</schema>'
GO
<e> の検証が成功するので、次の例は成功します。
DECLARE @var XML(SC)
SET @var = '<e xmlns="http://ns"><a>1</a><b>data</b></e>'
GO
次の例は成功します。要素 <c> はスキーマで定義されていませんが、インスタンスは受け入れられます。
DECLARE @var XML(SC)
SET @var = '<e xmlns="http://ns"><a>1</a><c>Wrong</c><b>data</b></e>'
GO
次の例の XML インスタンスは拒否されます。これは、<a> 要素の定義で文字列値が許可されていないためです。
DECLARE @var XML(SC)
SET @var = '<e xmlns="http://ns"><a>Wrong</a><b>data</b></e>'
SELECT @var
GO