2014-04-12 5 views
2

후속 요소 정의에서 참조 할 수있는 속성을 정의하려고했습니다.xsd에서 속성을 참조하는 방법

<xs:attribute name="ridref" type="xs:string"/> 

나중에 나는이처럼 사용

<xs:element name="coordRegRef"> 
    <xs:complexType> 
    <!--xs:attribute name="ridref" type="xs:string"/ this works but I want to use ref --> 
    <xs:attribute ref="ridref" use="required"/> 
    </xs:complexType> 
</xs:element> 

XSD는 xmllint가

xmllint --schema pc-ar.xsd pc-ar.xml 

으로 잘 컴파일하지만 xmllint가 내가 의미로 해석

pc-ar.xml:41: element coordRegRef: Schemas validity error : Element '{http://pc-ar.xsd}coordRegRef', attribute 'ridref': The attribute 'ridref' is not allowed. 
pc-ar.xml:41: element coordRegRef: Schemas validity error : Element '{http://pc-ar.xsd}coordRegRef': The attribute '{http://pc-ar.xsd}ridref' is required but missing. 

을 말한다 내 XML 파일은 네임 스페이스를 사용해야합니다. 대신

<coordRegRef ridref="111"/> 

의 ridref

<coordRegRef fix:ridref="111"/> 

(하지 작동하지만 원치 않는)을 검색 하시나요?

내 XSD

<?xml version="1.0"?> 
<!-- validate: xmllint - -schema pc-ar.xsd pc-ar.xml --> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://pc-ar.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://pc-ar.xsd" 
    xmlns:fix="http://pc-ar.xsd"> 

    <!--xs:attribute name="rid" type="xs:integer"/--> 

    <!--xs:attributeGroup name="ridGroup"> 
    <xs:attribute name="rid" type="xs:integer"> 
     <xs:annotation> 
      <xs:documentation>entry id</xs:documentation> 
     </xs:annotation> 
    </xs:attribute> 
</xs:attributeGroup--> 

    <xs:element name="name" type="xs:string"/> 
    <xs:attribute name="id" type="xs:ID"/> 
    <xs:attribute name="idref" type="xs:IDREF"/> 

    <xs:attribute name="ridref" type="xs:string"/> 

    <xs:element name="coordRegRef"> 
     <xs:complexType> 
      <!--xs:attribute name="ridref" type="xs:string"/works--> 
      <xs:attribute ref="ridref" use="required"/> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="assetRegRef"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="ridref2" type="xs:string"/> 
      </xs:sequence> 
      <!--xs:attribute name="ridref" type="xs:string"/works--> 
      <xs:attribute name="ridref" type="xs:string"/> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="lat"> 
     <xs:simpleType> 
      <xs:restriction base="xs:decimal"> 
       <xs:minInclusive value="-40"/> 
       <xs:maxInclusive value="-30"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 

    <xs:element name="lon" type="xs:decimal"/> 

    <xs:complexType name="coordRegTableType"> 
     <xs:sequence> 
      <xs:element name="entry" minOccurs="0" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element ref="name"/> 
         <xs:element ref="lat"/> 
         <xs:element ref="lon"/> 
        </xs:sequence> 
        <xs:attribute name="rid" type="xs:string"/> 
        <!--xs:attribute ref="fix:id" use="required"/--> 
        <xs:attribute name="id" type="xs:string" use="required"/> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="assetRegTableType"> 
     <xs:sequence> 
      <xs:element name="entry" minOccurs="0" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element ref="name"/> 
         <xs:element ref="coordRegRef"/> 
         <xs:element ref="assetRegRef"/> 
        </xs:sequence> 
        <xs:attribute name="rid" type="xs:string"/> 
        <xs:attribute name="id" type="xs:string" use="required"/> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:element name="coordReg" type="fix:coordRegTableType"> 
     <xs:unique name="coordRegNameUniq"> 
      <xs:selector xpath="*"/> 
      <xs:field xpath="fix:name"/> 
     </xs:unique> 
    </xs:element> 

    <xs:element name="assetReg" type="assetRegTableType"> 
     <xs:unique name="assetRegNameUniq"> 
      <xs:selector xpath="fix:entry"/> 
      <xs:field xpath="fix:name"/> 
     </xs:unique> 
    </xs:element> 

    <xs:element name="assetExchange"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="coordReg"/> 
       <xs:element ref="assetReg"/> 
      </xs:sequence> 
      <xs:attribute name="rid" type="xs:integer"/> 
      <!--xs:attribute ref="id" use="required"/--> 
     </xs:complexType> 

     <xs:key name="coordRegKey"> 
      <xs:selector xpath="fix:coordReg/fix:entry"/> 
      <xs:field xpath="@rid"/> 
     </xs:key> 

     <xs:key name="assetRegKey"> 
      <xs:selector xpath="fix:assetReg/fix:entry"/> 
      <xs:field xpath="@rid"/> 
     </xs:key> 

     <xs:keyref name="assetRegKeyRef" refer="assetRegKey"> 
      <xs:selector xpath=".//fix:assetRegRef"/> 
      <xs:field xpath="@ridref"/> 
     </xs:keyref> 

     <xs:keyref name="assetRegKeyRef2" refer="assetRegKey"> 
      <!--xs:selector xpath=".//fix:assetRegRef"/works--> 
      <!--xs:selector xpath="./*/*/fix:assetRegRef"/works--> 
      <!--xs:selector xpath="./*/fix:entry/fix:assetRegRef"/works--> 
      <!--xs:selector xpath="./*/*/fix:assetRegRef"/works--> 
      <xs:selector xpath=".//fix:assetRegRef"/> <!-- any assetRefRef --> 
      <xs:field xpath="fix:ridref2"/> 
     </xs:keyref> 

     <xs:keyref name="coordRegKeyRef" refer="coordRegKey"> 
      <xs:selector xpath=".//fix:coordRegRef"/> 
      <xs:field xpath="@ridref"/> 
     </xs:keyref> 

    </xs:element> 

</xs:schema> 

내 XML 테스트 파일이 발견하고는 유효성 검사 오류에서 볼 수 있듯이, 파서가 속성 ridref을 기대 않지만 그것을해야합니다으로

<?xml version="1.0"?> 

<assetExchange 
    xmlns="http://pc-ar.xsd" 
    xmlns:fix="http://pc-ar.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://pc-ar.xsd pc-ar.xsd" 
    rid="1"> 

<coordReg> 
    <entry id="1" rid="111"> 
    <name>sitea</name> 
    <lat>-31.23</lat> 
    <lon>151</lon> 
    </entry> 

    <entry id="2" rid="222"> 
    <name>siteb</name> 
    <lat>-31.23</lat> 
    <lon>151</lon> 
    </entry> 

    <entry id="3" rid="333"> 
    <name>sitec</name> 
    <lat>-31.23</lat> 
    <lon>151</lon> 
    </entry> 
</coordReg> 

<assetReg> 
    <entry id="11" rid="11"> 
    <name>deva</name> 
    <coordRegRef fix:ridref="111"/> 
    <assetRegRef ridref="aa"><ridref2>aa</ridref2></assetRegRef> 
    </entry> 

    <entry id="22" rid="22"> 
    <name>devb</name> 
    <coordRegRef ridref="2212"/> 
    <assetRegRef ridref="11"><ridref2>11</ridref2></assetRegRef> 
    </entry> 

    <entry id="33" rid="33"> 
    <name>devc</name> 
    <coordRegRef ridref="333"/> 
    <assetRegRef ridref="44"><ridref2>44</ridref2></assetRegRef> 
    </entry> 

</assetReg> 

</assetExchange> 
+0

도 http://stackoverflow.com/questions/8903768/unqualified-xsd-global-attribute-references?rq=1 볼 – philcolbourn

답변

5

네임 스페이스에서.

이유는 XML 스키마에서 모든 전역 요소, 특성 또는 형식 정의가 정규화되어야한다는 것입니다. 따라서 attributeFormDefault="unqualified"으로 설정 한 경우에도 전역 적으로 정의 된 모든 속성의 접두사는 네임 스페이스가됩니다. 해결 방법은 이러한 속성을 <xs:attributeGroup> (또는 전역 유형) 내에 혼자 정의하는 것입니다. 이 경우 속성 그룹의 이름은 내부에있는 속성의 이름 대신 네임 스페이스가 첨부됩니다. 그런 다음 ref을 사용하여 해당 특성 그룹을 참조하고 네임 스페이스에 있지 않아도 전역 적으로 사용할 수있는 특성을 얻을 수 있습니다.

+0

그것은 당신을 보인다 helderdarocha이 같은 일을 말을하는 I 용의자는 맞지만 내가 논평 한 바와 같이 요소들이 속성과 다른 이유를 이해하지 못한다. – philcolbourn

+1

엘리먼트는 애트리뷰트와 다르지 않다 (스키마에 관해서 이야기 할 때). 또한 전 세계적으로 선언 된 요소가 자격을 얻습니다. 그리고 예제 XML 문서에서 루트 요소에는 기본 네임 스페이스 선언이 있기 때문에 모든 요소는 네임 스페이스에 속합니다 (접미사가없는 경우에도 해당). 이 경우 속성은 기본 네임 스페이스가 속성에 적용되지 않는다는 점에서 요소와 다릅니다. 접두사가 붙은 속성들만 네임 스페이스를 가질 수 있습니다.그렇지 않으면 복잡한 네임 스페이스 변환없이 네임 스페이스가 아닌 특성을 만들 수 없습니다. – jasso

+0

고맙습니다. XSD에서 글로 z 요소 W 속성은 규정 화되어야합니다. 기본 네임 스페이스를 선언하여 XML 요소를 정규화했습니다. 이 기본 네임 스페이스는 특성에 적용되지 않습니다. 따라서 특성은 네임 스페이스로 정규화되어야합니다. 감사. – philcolbourn

4

전역 속성을 선언하기 때문에이 이름은 {http://pc-ar.xsd} 네임 스페이스의 일부입니다. XML의 접두어가없는 속성은 항상 네임 스페이스에 속하지 않습니다.

<xs:attributeGroup name="required-ridref"> 
    <xs:attribute name="ridref" type="xs:string" use="required"/> 
</xs:attributeGroup> 
<xs:attributeGroup name="not-required-ridref"> 
    <xs:attribute name="ridref" type="xs:string" use="required"/> 
</xs:attributeGroup> 

을 그리고 어디를 그룹을 참조 : 로컬 속성을 선언하고, 또한 XML의 특성을 앞에 싶지 않아 원하지 않는 경우에 따라서, 대안 atrribute 그룹 내부를 래핑하는 것입니다 속성 참조 할 것 :

<xs:element name="coordRegRef"> 
    <xs:complexType> 
     <xs:attributeGroup ref="required-ridref" /> 
    </xs:complexType> 
</xs:element> 

<xs:element name="assetRegRef"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="ridref2" type="xs:string"/> 
     </xs:sequence> 
     <xs:attributeGroup ref="not-required-ridref"/> 
    </xs:complexType> 
</xs:element> 
+0

또한 coordRegTableType에서 요소 참조 (예 : .name)를 사용하고 이것이 작동하는 것 같습니다. 내 무지에서는 이것들은 동일한 의미로 보이지만 요소들은 작동하고 (작동하는 것처럼 보이고) 속성은 그렇지 않습니다. 이 겉으로보기에 다른 행동에 대한 설명이 있습니까? – philcolbourn