2012-02-09 20 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> 

我想從/限制值在ActiveServer指定的那些或PassiveServer

在XSD,我嘗試以下方法:

<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> 

不起作用(字段必須引用一個實例;只指定其中一個將工作)。

有什麼方法可以忽略如何在字段xpath值中獲取元素的文本內容?

+0

好了,所以它看起來像我可以用'的XPath ='爲重點的字段值......然而,選擇表達'的XPath =’.// ActiveServer | PassiveServer「只匹配任一元素名稱中的第一個(不是第一次出現,第一次匹配),所以如果keyref包含」2 @ db1「作爲值,即使它在PassiveServer中指定,它也不會有效。 – 2012-02-09 21:30:37

回答

0

我希望下面的工作:

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

注意 「|」具有最低優先級,因此需要重複「.//」。該BNF從XSD建議:「。‘

Selector ::= Path ('|' Path)*