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

작동하지 않습니다 (필드는 하나의 인스턴스를 참조해야하며 그 중 하나만 지정하면 작업 할 수 있음).

필드 xpath 값에서 요소의 텍스트 콘텐츠를 가져 오는 방법을 간과 할 수있는 방법이 있습니까?

+0

좋아, 그래서'XPath를 사용할 수있는 것처럼 = 보이는'키의 필드 값에 대한 ... 그러나, 선택 식'XPath는 = ".// ActiveServer | PassiveServer "는 두 요소 이름 중 첫 번째 일치 (첫 번째 일치, 첫 번째 일치가 아님) 만하므로 keyref는 PassiveServer에 지정되어 있어도 값으로"2 @ db1 "을 포함하는 경우 유효하지 않습니다. –

답변

0

내가 기대할 수있는 일을 다음

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

주를 "|" 가장 낮은 우선 순위를 가지므로 ".//"을 반복해야합니다. XSD를 녹화에서 BNF : "."

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