0

次のxmlがあります。

<a>
  <thing tag="song1">
    <name>john doe</name>
    <email>john@example.com</email>
  </thing>
  <owner thing="/a/thing[@tag='song1']">
    ...
  </owner>
</a>

タグ 'song1' を持つ 'thing' が存在する場合、'owner' には thing='/a/thing[@tag='song1'] が必要であることを XSD で主張したいと思います。

XSDでの私の論理的な試みは

<sch:assert 
  test="(count(a:owner[@thing=a:thing[@tag='song1']]) > 0) = count(a:thing[@tag='song1']) > 0))">Error</sch:assert>
      </sch:rule>

Oxygen Validator は、この xsd に対してエラーを返します。助けてください。ありがとう。

4

2 に答える 2

0

最後に、このように song1 の部分文字列をチェックすることになりました。

test="(count(a:thing[substring(@tag,19,8) = 'song1']) > 0)">

/a/thing と /./a/thing は同じように正しいので、完璧な方法ではありませんが、私が知る限り、ユーザーは同じパターンに固執しています。また、理想的な世界では、このケースは実行時にチェックする必要があります。

それが役に立てば幸い。

于 2013-04-21T22:32:07.510 に答える
0

XPath 式を文字列として受け取り、それを評価した結果を返す関数が必要です。これは、Saxon では saxon:evaluate() として利用できます。

第 2 に、単純型のアサーションは検証中の文字列にしかアクセスできません。複合型のアサーションは、要素ノードをルートとするツリーにアクセスできます。パス式は「/」で始まるため、ドキュメント ノードをルートとするツリーでのみ機能します。パスを変更した場合../a/thing[@tag='song1']は、フォームの a 要素のアサーションで検証できます

assert test="every $o in owner satisfies exists(saxon:evaluate($o/@thing))"
于 2013-04-22T07:50:19.017 に答える