2

allとについては知ってchoiceいますが、次のように、いくつかの要素を複数回発生させたい場合を考慮していません。

<Root>
    <ThingA/>
    <ThingB/>
    <ThingC/>
    <ThingC/>
    <ThingC/>
</Root>

を使用することもできますsequenceが、これらの子を任意の順序で配置できるようにしたいと考えています。を使用できanyましたが、複数の を使用することはできませんでしThingCた。を使用できましたが、 andを 0 または 1 にchoice制限できませんでした。ThingAThingB

これは XSD では困難または不可能でしたが、RELAX NG では可能であるとどこかで読んだことがあると思います。残念ながら、どこで読んだか覚えていません。

助けてくれてありがとう!

4

1 に答える 1

6

そうです。XMLスキーマでやりたいことを行うことはできませんが、RELAXNGでは次の方法で行うことができます。

<element name="Root">
  <interleave>
    <element name="ThingA"><empty /></element>
    <element name="ThingB"><empty /></element>
    <oneOrMore><element name="ThingC"><empty /></element></oneOrMore>
  </interleave>
</element>

XMLスキーマのオプションは次のとおりです。

  • 入力XMLを特定の順序に正規化する前処理ステップを追加してから、<xs:sequence>
  • を使用し<xs:choice>、検証を追加して(たとえば、Schematronを使用して)、1つ<ThingA>以下または<ThingB>
  • マークアップ言語の要素の順序を修正することを決定します

通常、3番目が最良のオプションであることがわかります。通常、XMLのジェネレーターが特定の順序で要素を出力するためのコストはそれほど高くなく、検証に役立つだけでなく、順序が事前にわかっている場合はXMLの消費にも役立ちます。

于 2008-09-19T19:08:58.057 に答える