2011-11-08 34 views
5

Tôi có một tập tin XSD như dưới đây:XSD - làm thế nào để xác định mối quan hệ giữa hai yếu tố

<element name="finder-def" minOccurs="0" maxOccurs="unbounded"> 
    <complexType> 
     <attribute name="name" type="string" use="required"></attribute> 
     <attribute name="description" type="string"></attribute> 
     <attribute name="class" type="string" use="required"></attribute> 
    </complexType> 
</element> 

<complexType name="Dimension"> 
    <sequence> 
     <element name="finder" type="Finder" minOccurs="0" maxOccurs="1"/> 
    </sequence> 
</complexType> 

<complexType name="Finder"> 
    <attribute name="name" type="String" use="required"/> 
</complexType> 

tập tin XML tương ứng với tệp XSD trên là dưới đây:

<finder-def name="circleFinder" description="Finds circle based on msisdn" class="com.onmobile.reporting.etl.processor.common.propertyplugins.CircleIdPropertyPlugin" /> 

<dimension name="circleId"> 
    <finder name="circleFinder" /> 
</dimension> 

Vì vậy, ở đây tôi đã xác định một finder-def tức là circleFinder và sau đó muốn tham khảo phần này finder-def đến finder.

Vì vậy, câu hỏi là Làm thế nào tôi có thể xác nhận rằng findercircleFinder có, định nghĩa của nó được xác định trên trong finder-def

+0

Cung cấp một .xml hợp lệ và compltete và một mẫu XSD hợp lệ và đầy đủ. – FailedDev

Trả lời

2

Chỉ cần một cách khác để sử dụng ID và IDREF loại bên trong giản đồ. Ví dụ: mẫu XML:

<?xml version="1.0" encoding="UTF-8"?> 
<f:root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:f="http://test.com/finder" xsi:schemaLocation="http://test.com/finder finder.xsd"> 

<f:finder-def name="circleFinder" description="Finds circle based on msisdn" 
       class="com.onmobile.reporting.etl.processor.common.propertyplugins.CircleIdPropertyPlugin"/> 

<f:dimension name="circleId"> 
    <f:finder name="circleFinder"/> 
</f:dimension> 
</f:root> 

giản đồ XSD (Tôi đã định dạng cho nó một chút để xác nhận)

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://test.com/finder" 
     xmlns:tns="http://test.com/finder" 
     elementFormDefault="qualified" attributeFormDefault="unqualified"> 
<xsd:element name="root"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="finder-def" type="tns:finder-def" minOccurs="0" maxOccurs="unbounded"/> 
      <xsd:element name="dimension" type="tns:Dimension" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 
<xsd:complexType name="finder-def"> 
    <xsd:attribute name="name" type="xsd:ID" use="required"/> 
    <xsd:attribute name="description" type="xsd:string"/> 
    <xsd:attribute name="class" type="xsd:string" use="required"/> 
</xsd:complexType> 
<xsd:complexType name="Dimension"> 
    <xsd:sequence> 
     <xsd:element name="finder" type="tns:Finder" minOccurs="0" maxOccurs="1"/> 
    </xsd:sequence> 
    <xsd:attribute name="name" type="xsd:string"/> 
</xsd:complexType> 
<xsd:complexType name="Finder"> 
    <xsd:attribute name="name" type="xsd:IDREF" use="required"/> 
</xsd:complexType> 
</xsd:schema> 
+0

@Viktor +1 - Một vấn đề trong cách tiếp cận trên là bây giờ các lớp java được tạo ra từ XSD ở trên sử dụng JAXB có thuộc tính 'name' của kiểu 'Object' thay vì 'String'. Và tôi đã sử dụng những lớp học được tạo ra ở những nơi khác nhau. Vậy có cách nào khác cho việc này không? –

+0

+1 - Để biết thêm thông tin về JAXB và '@ XmlID' /' @ XmlIDREF', hãy xem: http://blog.bdoughan.com/2010/10/jaxb-and-shared-references-xmlid-and.html –

+0

Làm cho "name" như của chuỗi kiểu và thêm một số khác "ref" của loại IDREF. Ngoài ra, bạn có thể thêm phần tử bên trong của loại IDREF cho phần tử "finder" và thêm chú thích jaxb vào nó xsd: annotation-> xsd: appinfo-> jaxb: property-> jaxb: giá trị baseType com.test.finder.finder-def để phần tử đó có kiểu đúng sau khi tạo lớp xsd-java. –

Các vấn đề liên quan