2

次のような XML 構造があります。

<root>
   <hierarchy1>
       <foo id="foo1" /> <!-- id is of type id -->
       <bar id="bar1" /> <!-- id is of type id -->
   </hierarchy1>
   <hierarchy2>
       <foohandler ref="foo1" /> <!-- ref is of type idref -->
       <barhandler ref="bar1" /> <!-- ref is of type idref -->
   </hierarchy2>
</root>

つまり、ID を持つさまざまなタイプのオブジェクトがあり、IDREF を使用してこれらの ID を参照する必要があるさまざまなタイプのターゲット オブジェクトがあります。

IDREFが正しい期待されるタイプであることを確認する方法はありますか?

  • <foohandler ref="foo1" />は有効ですが、
  • <foohandler ref="bar1" />そうじゃない?
4

2 に答える 2

2

ID / IDREFの代わりに、xs:key / xs:keyrefを使用します。詳細はお任せします。行き詰まったらもう一度聞いてください。

于 2012-11-26T18:52:57.290 に答える
2

OPの要求を達成するために、パターンベースの制限( foo [0-9] +など)を使用した回答をほぼ投稿しました。しかし、投稿する前に、私はキーkeyrefについて知りました。これが解決策のようです。そこで、次のスキーマを思いつきました。しかし、最初は、ばかげた名前空間宣言の問題のために機能しませんでした。私は主にそれを投稿しています。なぜなら、私は以前にもこれを行う方法を知らなかったので、私はほとんどそこにいることを知っていたので、夢中になりました。

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns="http://stackoverflow.com"
           xmlns:so="http://stackoverflow.com"
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           targetNamespace="http://stackoverflow.com"
           attributeFormDefault="qualified"
           elementFormDefault="qualified">
  <xs:element name="root" type="rootType">
    <xs:key name="fooKey">
      <xs:selector xpath="so:hierarchy1/so:foo"/>
      <xs:field xpath="@so:key"/>
    </xs:key>
    <xs:key name="barKey">
      <xs:selector xpath="so:hierarchy1/so:bar"/>
      <xs:field xpath="@so:key"/>
    </xs:key>
    <xs:keyref name="fooKeyref" refer="fooKey">
      <xs:selector xpath="so:hierarchy2/so:foohandler"/>
      <xs:field xpath="@so:keyref"/>
    </xs:keyref>
    <xs:keyref name="barKeyref" refer="barKey">
      <xs:selector xpath="so:hierarchy2/so:barhandler"/>
      <xs:field xpath="@so:keyref"/>
    </xs:keyref>
  </xs:element>

  <xs:complexType name="rootType">
    <xs:sequence>
      <xs:element name="hierarchy1" type="hierarchy1Type"/>
      <xs:element name="hierarchy2" type="hierarchy2Type"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="hierarchy1Type">
    <xs:sequence>
      <xs:element name="foo" type="fooType"/>
      <xs:element name="bar" type="barType"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="hierarchy2Type">
    <xs:sequence>
      <xs:element name="foohandler" type="foohandlerType"/>
      <xs:element name="barhandler" type="barhandlerType"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="fooType">
    <xs:attribute name="key" type="xs:integer"/>
  </xs:complexType>

  <xs:complexType name="barType">
    <xs:attribute name="key" type="xs:integer"/>
  </xs:complexType>

  <xs:complexType name="foohandlerType">
    <xs:attribute name="keyref" type="xs:integer"/>
  </xs:complexType>

  <xs:complexType name="barhandlerType">
    <xs:attribute name="keyref" type="xs:integer"/>
  </xs:complexType>
</xs:schema>

上記のスキーマは、以下のXMLドキュメントを検証します。

<?xml version="1.0" encoding="UTF-8"?>
<so:root xmlns:so="http://stackoverflow.com"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://stackoverflow.com a.xsd">
  <so:hierarchy1>
    <so:foo so:key="1"/>
    <so:bar so:key="2"/>
  </so:hierarchy1>
  <so:hierarchy2>
    <so:foohandler so:keyref="1"/>
    <so:barhandler so:keyref="2"/>
  </so:hierarchy2>
</so:root>

<so:barhandler so:keyref="2"/>に変更された場合、<so:barhandler so:keyref="1"/>または<so:barhandler so:keyref="3"/>ドキュメントが無効になった場合。

ここでの落とし穴は、名前空間を指定せず、の属性でxmlns:so="http://stackoverflow.com"これと同じ名前空間を使用しないと、一部のパーサーはドキュメントの整合性を気にしないということです。xpathxs:selectorxs:field

EclipseのXMLパーサー/バリデーターとこのオンラインツールは、XPath式が参照する名前空間を指定するまで、私のキーkeyref宣言についてのくだらないことをしませんでした。

一番下の石灰は、すべての名前空間を使用することである可能性がありますか?

この答えは私を私の関連性に導きます。

于 2012-11-27T07:56:34.653 に答える