2012-02-09 3 views
2

XMLスキーマのキー/次のXML-スニペットを考えるとkeyref問題

<Environment> 
... 
    <MySqlConfiguration> 
     <ActiveServer>[email protected]</ActiveServer> 
     <PassiveServer>[email protected]</PassiveServer> 
     <Replicate from="[email protected]" to="[email protected]" /> 
     <Replicate from="[email protected]" to="[email protected]" /> 
    </MySqlConfiguration> 
... 
</Environment> 

私はXSDでActiveServerで指定されているものやPassiveServer

の値に/から制限したい、私は次のことを試してください:

<xs:element name="Environment" type="environment" > 
    <xs:key name="ServerKey"> 
     <xs:selector xpath=".//ActiveServer|PassiveServer"/> 
     <xs:field xpath="*"/> 
    </xs:key> 
    <xs:keyref name="ServerKeyRef" refer="ServerKey"> 
     <xs:selector xpath=".//Replicate"/> 
     <xs:field xpath="@from"/> 
    </xs:keyref> 
    ... 
    </xs:element> 

しかし、キーでxpath="*"フィールドセレクタは(それがアクティブ/ PassiveServer要素のテキストノードを取得していない)動作しません。 xpath="text()"も機能しません。

<xs:element name="Environment" type="environment" > 
    <xs:key name="ServerKey"> 
     <xs:selector xpath="Environment"/> 
     <xs:field xpath="ActiveServer|PassiveServer"/> 
    </xs:key> 
    <xs:keyref name="ServerKeyRef" refer="ServerKey"> 
     <xs:selector xpath=".//Replicate"/> 
     <xs:field xpath="@from"/> 
    </xs:keyref> 
    ... 
    </xs:element> 

(フィールドは1つのインスタンスを参照する必要がありますが、1つのインスタンスのみが動作する必要があります)。

フィールドのxpath値で要素のテキストコンテンツを取得する方法を見落としていますか?

+0

わかりましたので、私は' XPathを使用することができますようにそれが見える= 'キーのフィールド値のため...しかし、セレクタ式'のxpath =』.// ActiveServer | PassiveServer "はいずれの要素名の最初のもの(最初の一致、最初の一致ではない)にのみ一致するため、keyrefはPassiveServerで指定されていても値として' '2 @ db1" 'を含む場合、 –

答えて

0

私は期待に動作するには、次

<xs:selector xpath=".//ActiveServer|.//PassiveServer"/> 
    <xs:field xpath="."/> 

注意を "|" 「.//」を繰り返す必要があるため、優先順位が最も低くなります。 XSD録音からBNF:「。 『

Selector ::= Path ('|' Path)* 
関連する問題