アプリ版:「スタンプのみでお礼する」機能のリリースについて

前半は、順番とおりの必須タグで、後半は順不同の任意タグのSchemaの指定を教えてください。
以下の例では、aa,bb,ccが、この順で必須、xx,yy,zzは、この順で任意です。
xx,yy,zzを順番関係なく指定できるようにしたいです。
よろしくお願いします。

<xsd:sequence>
<xsd:element name="aa" type="xsd:string"/>
<xsd:element name="bb" type="xsd:string"/>
<xsd:element name="cc" type="xsd:string"/>
<xsd:element name="xx" type="xsd:string" minOccurs="0" />
<xsd:element name="yy" type="xsd:string" minOccurs="0" />
<xsd:element name="zz" type="xsd:string" minOccurs="0" />
</xsd:sequence>

A 回答 (4件)

[No.3] のお礼の質問に対する回答ね。


「MSVでは、OKになりますが、PHPではエラーに なります。 もし、この事情が分かるなら、教えて下さい。」

エラーを出す PHP が正しいよ。
xsd:all は、使用制限が二つあって、

1) xsd:complexType のはじめの子要素で、唯一の子要素にしかなれない。
2) xsd:all のなかで、sequence や group のようなグループ要素はつかえない。

なので、『できないけど。』ということ。
    • good
    • 0
この回答へのお礼

ありがとうございます。
自分の理解の低さが分かりました。
精進を重ねて行きたいと思います。

お礼日時:2012/03/12 23:36

つまり



<xds:sequence>
  <xsd:element name="aa" type="xsd:string"/>
  <xsd:element name="bb" type="xsd:string"/>
  <xsd:element name="cc" type="xsd:string"/>
  <xsd:all>
    <xsd:element name="xx" type="xsd:string" minOccurs="0" />
    <xsd:element name="yy" type="xsd:string" minOccurs="0" />
    <xsd:element name="zz" type="xsd:string" minOccurs="0" />
  </xsd:all>
</xsd:sequence>

のようなことをしたいということだよね。
できないけど。

『[No.2] のお礼』より引用
> こんなに面倒な指定になってしまうのは、残念です。
> Schemaの弱いところでしょうか。

う~ん。今回の XML の設計がそもそも気持ち悪いかなぁ。

xx, yy, zz は type が xsd:string だし、最大で1つで、順番が任意なら、属性でいい気がする。
あとは、xx, yy, zz を別の要素の子要素にするか、かな?

<xsd:complexType>
  <xsd:sequence>
    <xsd:element name="aa" type="xsd:string"/>
    <xsd:element name="bb" type="xsd:string"/>
    <xsd:element name="cc" type="xsd:string"/>
    <xsd:element name="options" type="Options"/>
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Options">
  <xsd:all>
    <xsd:element name="xx" type="xsd:string" minOccurs="0" />
    <xsd:element name="yy" type="xsd:string" minOccurs="0" />
    <xsd:element name="zz" type="xsd:string" minOccurs="0" />
  </xsd:all>
</xsd:complexType>
    • good
    • 0
この回答へのお礼

時間が空いてしまって、すみません。
同じXSDが、
MSVでは、OKになりますが、PHPではエラーになります。
もし、この事情が分かるなら、教えて下さい。
PHPでの作成を目指しています。

C:\tmp\20120311>java -jar C:\msv\msv.jar a3.xsd a3.xml
スキーマを読み込んでいます...
検証しています: a3.xml
文書は妥当(valid)です

C:\tmp\20120311>c:\xampp\php\php.exe -v
PHP 5.3.8 (cli) (built: Aug 23 2011 11:50:20)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies

C:\tmp\20120311>c:\xampp\php\php.exe test3.php
Warning: DOMDocument::schemaValidate(): Invalid Schema in C:\tmp\20120311\test3.
php on line 10
E1 code(3033) line(9) column(0) message(Element '{http://www.w3.org/2001/XMLSche
ma}sequence': The content is not valid. Expected is (annotation?, (element | gro
up | choice | sequence | any)*).
) level(2) file(file:///C:/tmp/20120311/a3.xsd)

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="aa" type="xsd:string" />
<xsd:element name="bb" type="xsd:string" />
<xsd:element name="cc" type="xsd:string" />
<xsd:all>
<xsd:element name="dd" type="xsd:string" minOccurs="0" maxOccurs="1" />
<xsd:element name="ee" type="xsd:string" minOccurs="0" maxOccurs="1" />
<xsd:element name="ff" type="xsd:string" minOccurs="0" maxOccurs="1" />
</xsd:all>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

お礼日時:2012/03/11 21:55

抜けがありました。


 <xsd:choice minOccurs="0">
ではなく,
 <xsd:choice minOccurs="0" maxOccurs="unbounded">
でないといけませんね。

ただし,DTDでの表記が
<!ELEMENT foo (aa, bb, cc, (dd | ee | ff)?)>
ではなく,
<!ELEMENT foo (aa, bb, cc, ((dd, ((ee, ff?) | (ff, ee?)?)) | (ee, ((ff, dd?) | (dd, ff?)?)) | (ff, ((dd, ee?) | (ee, dd?)?)) )? ) >
であるならば (dd/ee/ffは順不同で,各要素は最大ひとつ),
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:element name="foo">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element ref="aa" />
    <xsd:element ref="bb" />
    <xsd:element ref="cc" />
    <xsd:choice minOccurs="0" maxOccurs="1">
     <xsd:sequence>
      <xsd:element ref="dd" />
      <xsd:choice>
       <xsd:sequence>
        <xsd:element ref="ee" />
        <xsd:element minOccurs="0" maxOccurs="1" ref="ff" />
       </xsd:sequence>
       <xsd:sequence minOccurs="0" maxOccurs="1">
        <xsd:element ref="ff" />
        <xsd:element minOccurs="0" maxOccurs="1" ref="ee" />
       </xsd:sequence>
      </xsd:choice>
     </xsd:sequence>
     <xsd:sequence>
      <xsd:element ref="ee" />
      <xsd:choice>
       <xsd:sequence>
        <xsd:element ref="ff" />
        <xsd:element minOccurs="0" maxOccurs="1" ref="dd" />
       </xsd:sequence>
       <xsd:sequence minOccurs="0" maxOccurs="1">
        <xsd:element ref="dd" />
        <xsd:element minOccurs="0" maxOccurs="1" ref="ff" />
       </xsd:sequence>
      </xsd:choice>
     </xsd:sequence>
     <xsd:sequence>
      <xsd:element ref="ff" />
      <xsd:choice>
       <xsd:sequence>
        <xsd:element ref="dd" />
        <xsd:element minOccurs="0" maxOccurs="1" ref="ee" />
       </xsd:sequence>
       <xsd:sequence minOccurs="0" maxOccurs="1">
        <xsd:element ref="ee" />
        <xsd:element minOccurs="0" maxOccurs="1" ref="dd" />
       </xsd:sequence>
      </xsd:choice>
     </xsd:sequence>
    </xsd:choice>
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
 <xsd:element name="aa" type="xsd:string" />
 <xsd:element name="bb" type="xsd:string" />
 <xsd:element name="cc" type="xsd:string" />
 <xsd:element name="dd" type="xsd:string" />
 <xsd:element name="ee" type="xsd:string" />
 <xsd:element name="ff" type="xsd:string" />
</xsd:schema>
のようになります (Visual Studio 2010でDTDを変換させました)。
    • good
    • 0
この回答へのお礼

ありがとうございます。
こっちです。でも、こんなに面倒な指定になってしまうのは、残念です。
Schemaの弱いところでしょうか。

お礼日時:2012/03/07 06:13

<xsd:sequence>


 <xsd:element name="aa" type="xsd:string" />
 <xsd:element name="bb" type="xsd:string" />
 <xsd:element name="cc" type="xsd:string" />
 <xsd:choice minOccurs="0">
  <xsd:element name="dd" type="xsd:string" />
  <xsd:element name="ee" type="xsd:string" />
  <xsd:element name="ff" type="xsd:string" />
 </xsd:choice>
</xsd:sequence>
こんな感じでしょうか。
# U+3000はU+0020等へ置き換えてください。

なお,「任意タグ」を,「0回以上の繰り返しを許す子要素」と解釈しています。
    • good
    • 0
この回答へのお礼

ありがとうございます。
でも、これだと、以下のXMLは、要素「ee」が余計と怒られます。
dd, ee, ff 全部指定してもよいようにしたい。

<?xml version="1.0"?>
<root>
<aa>aaa</aa>
<bb>bbb</bb>
<cc>ccc</cc>
<ff>fff</ff>
<ee>eee</ee>
</root>

お礼日時:2012/03/07 00:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A