2016-04-23 15 views
0

私はXSDスキーマと闘争しています。私は、ノード内の要素の1つだけがcetrainの芸術作品を持つことができ、他の要素に影響を与えないという制限を設けたいと考えています。XMLスキーマ - 要素の1つのみが属性を持つことができます

あなたに有効および無効なXMLファイルの例を与えることは良いだろう:

有効なXML

タグsomeoneがattriubte @idが含まれている必要があり、そのうちの一つだけが持っている光栄されるだろうcaptain値の@status属性です。

<node> 
    <someone id="01">Alex</someone> 
    <someone id="02">Amanda</someone> 
    <someone id="03" status="captain">Bob</someone> 
    <someone id="04">Costa</someone> 
</node> 


無効なXML

以下のものは無効です。 @statusで2つの方法を持つ方法はありません。

<node> 
    <someone id="01" status="captain">Alex</someone> 
    <someone id="02">Amanda</someone> 
    <someone id="03" status="captain">Bob</someone> 
    <someone id="04">Costa</someone> 
</node> 

もない可能@idをスキップします。

<node> 
    <someone status="captain">Alex</someone> 
    <someone id="01">Amanda</someone> 
    <someone id="02">Costa</someone> 
</node> 

私の実際のXSD

私はこれまでxsdファイルの以下の部分を持っている、しかし私は、上記の制限を適用する方法は考えています。

<xsd:complexType name="nodeType"> 
    <xsd:sequence> 
     <xsd:element name="someone" type="xsd:string"/> 
    </xsd:sequence> 
    <xsd:attribute name="id" type="idType" use="required"/> 
</xsd:complexType> 

私は助けを感謝しています。私はを使ってより良い仕事をしてくれると思っていますが、実際にはそれほど経験はありません。

答えて

1

XSD 1.0では実行できません。アサーションを使用するXSD 1.1での操作は非常に簡単です。わからない私は正確に状況を理解し、それは以下

<xs:assert test="count(*/@status)=1"/> 
+0

ありがとう、それは私が探していたものです。好奇心をそそるだけのこと:Schematronで同じことをする方法はありますか? –

+0

はい、schematronの表現力は同じです。しかし、私は構文を覚えていないので、私はそれを使用して以来、長い時間です。 –

+0

どうかありがとうございました。) –

1

何かすることは必要なのSchematronです:

<?xml version="1.0" encoding="utf-8"?> 
<iso:schema xmlns="http://purl.oclc.org/dsdl/schematron" xmlns:iso="http://purl.oclc.org/dsdl/schematron" 
    queryBinding='xslt2' schemaVersion='ISO19757-3'> 
    <iso:pattern id="check"> 
     <iso:rule context="/node/someone"> 
      <iso:assert test= "count(.[@status='captain']) = 1"> 
       You cannont have more than one &lt;someone&gt; with status attribute = captain 
      </iso:assert> 
      <iso:assert test= "boolean(@id)"> 
       id is required attribute in &lt;someone&gt;. 
      </iso:assert> 
     </iso:rule> 
    </iso:pattern> 
</iso:schema> 

あなたはそれをテストするためにJavaのためのph-schematronライブラリをチェックしたい場合があります。

上記のスキームトロンとサンプルxml hereを使用している作業コードを見つけることができます。

+0

ありがとう、私はその論理を今理解しています:) –

関連する問題