2012-02-09 49 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)*