XSD1.1 assert 機能を使用して、要素をコンテンツ レベルで検証したいと考えています。(正確には、XMLで表現されたEDIFACTにcontent-combinationsの存在を確認したいのですが、それは本題ではありません...)
XPath をテストするために、次のミニ テスト シナリオを作成しました。
XML
<root>
<group>
<elem1>test1</elem1>
<elem2>test2</elem2>
</group>
<group>
<elem1>something1</elem1>
<elem2>something2</elem2>
</group>
<group>
<elem1>other1</elem1>
<elem2>other2</elem2>
</group>
</root>
要件は次のとおりです。test1 + test2 文字列の組み合わせと、something1 と something2 文字列の組み合わせがあることを確認したいです。other1 + other2 グループのようなグループが存在する可能性がありますが、私は気にしません。ここでの 3 つのグループの順序も影響しないはずです。
テストする必要がある XSD は次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="group" minOccurs="1" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="elem1" minOccurs="1">
</xsd:element>
<xsd:element name="elem2" minOccurs="1">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:assert test="(count(./group/elem1/text() = 'test1') > 0
and count(./group/elem2/text() = 'test2') > 0)
and (count(./group/elem1/text() = 'something1') > 0
and count(./group/elem2/text() = 'something2') > 0)"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
興味深い点は次のとおりです。
(count(./group/elem1/text() = 'test1') > 0
and count(./group/elem2/text() = 'test2') > 0)
and (count(./group/elem1/text() = 'something1') > 0
and count(./group/elem2/text() = 'something2') > 0)
またはそれを分解するには:
count(./group/elem1/text() = 'test1') > 0
私の問題は次のとおりです。式(より具体的にはカウント)は、文字列が一致しなくてもtrueを返します。たとえば、「test1」に対してテストしますが、文字列は「test」です。
./group/elem1/text() = 'test1'
その中で自己動作します。true または false を正しく返します。しかし、count on it を使用しても機能しません。(常にtrueを返すようです)
カウントはここでは正しい解決策ではないと思います。問題は、各グループを「正確に」テストしたくないのですが、すべてのグループがすべての繰り返しの中で「これとこの特定の組み合わせが少なくとも 1 回発生する」ことです。グループの。
私はこれを Saxon 9 EE でテストしていますが、XPath は他の XPath 実装でも同じ動作をします。
どんな助けでも大歓迎です。
ありがとう、えぇ
編集:
Mads Hansen と Michael Kay の助けを借りてこれを機能させた後 (ありがとう!)、最後のハードルが 1 つありました。
このケースを考えてみましょう:
<root>
<group>
<elem1>test1</elem1>
<elem2>WRONG</elem2>
</group>
<group>
<elem1>WRONG</elem1>
<elem2>test2</elem2>
</group>
</root>
このXPathで
count(group[elem1/text() = 'test1' and elem2/text() = 'test2']) > 0)
これにより、上記の例は有効ではなくなりますが (私が望むように)、元の XPath は 内でチェックしなかったため、上記を検証しました。