4 に答える
要件は、文脈自由言語を認識することです。コンテンツモデルが正規表現である必要があり、したがって通常の文脈自由言語ではない言語を定義する必要があるスキーマ言語のコンテンツモデルでは、これを行うことはできません。現在広く使用されているスキーマ言語では、コンテンツモデルで文脈自由言語を定義できません。
オプションは、(1)テクノロジーに対抗するのではなく、自由に使用できるテクノロジーでより適切に機能するようにデザインを変更する、(2)アドホックプロセス(InfantPro「Aravind」によって提案されたXSLTスタイルシートなど)を使用する、または(3)を使用することです。制約を適用するためのSchematronまたはXSD1.1のアサーション。
これはXSD1.0では不可能です。1.1でも不可能だと思います。
Schematronのような代替方法があります。または、XSLTを使用して結果を変換および出力することもできます。次に、XMLが有効かどうかを確認するために検証できます。
この2番目の方法について簡単に説明します。
サンプル入力XML:
<?xml version="1.0" encoding="utf-8"?>
<root>
<a/>
<a/>
<b/>
<b/>
</root>
サンプルXSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
<validation>
<xsl:choose>
<!--Output 'true' if count is equal .. and 'false' otherwise-->
<xsl:when test="count(a)=count(b)">
<xsl:text>true</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>false</xsl:text>
</xsl:otherwise>
</xsl:choose>
</validation>
</xsl:template>
</xsl:stylesheet>
count(a)はcount(b)と等しいので、これは次のように出力します。
<?xml version="1.0" encoding="utf-8"?>
<validation>true</validation>
そして、その順番は以下に対して検証されます:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="validation" type="xs:boolean" fixed="true"/>
</xs:schema>
<validation>
この場合、ノードに値があるため、これは通過しますtrue
注:XSLTは、拡張検証に使用している変換されたコピーを作成するだけで、元の入力を変更しません。
InfantProの「Aravind」の状態が正しくありません。
This is not possible with XSD 1.0. I think not possible with 1.1 as well.
実際、XSD1.1アサーションを使用することはかなり可能です。任意の数のAsとそれに続く任意の数のBを許可するコンテンツモデルを定義してから、アサーションを追加するだけです。
<xs:assert test="count(A) = count(B)"/>