3

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 は 内でチェックしなかったため、上記を検証しました。

4

2 に答える 2

3

XPath を調整して、探しているアイテムをフィルタリングし、残っているものをカウントする必要があります。現在の式は、いずれかのgroup/elem1/text()ノードが に等しいかどうかを評価してtest1おり、これは または のいずれtrue()false()になり、ブール値を数えています。

述語を使用してtext()値をテストし、条件を満たす数をカウントします。

count(./group/elem1/text()[.='test1'])
于 2016-05-10T15:08:29.053 に答える