ElementFormDefault làm gì trong XSD?


88

Làm gì elementFormDefault, và khi nào thì nên sử dụng?

Vì vậy, tôi đã tìm thấy một số định nghĩa cho elementFormDefaultcác giá trị:

đủ điều kiện - các phần tử và thuộc tính nằm trong targetNamespace của lược đồ

không đủ tiêu chuẩn - các phần tử và thuộc tính không có vùng tên

Vì vậy, từ định nghĩa đó, tôi sẽ nghĩ rằng nếu một lược đồ được đặt thành đủ điều kiện thì tại sao bạn phải đặt tiền tố cho loại với không gian tên? Và những tình huống mà bạn thậm chí có thể đặt ra để không đủ tiêu chuẩn cho vấn đề đó là gì? Tôi đã thử Googling, nhưng tất cả những gì tôi nhận được là một vài trang W3C cực kỳ khó hiểu.

Đây là file mình đang thao tác tại sao lại khai báo kiểu như target:TypeAssignmentskhi khai báo kiểu targetNamespaceas the same as xmlns:target?

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns" 
        elementFormDefault="qualified">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignments" type="target:TypeAssignments"
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="TypeAssignments">
    <sequence>
      <element name="assignment" type="target:assignmentInfo"
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
      <element name="page" type="target:TypePage"/>
      <element name="file" type="target:TypeFile" 
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
  <simpleType name="TypePage">
    <restriction base="integer">
      <minInclusive value="50" />
      <maxInclusive value="498" />
    </restriction>
  </simpleType>
  <simpleType name="TypeFile">
    <restriction base="string">
      <enumeration value=".xml" />
      <enumeration value=".dtd" />
      <enumeration value=".xsd" />
    </restriction>
  </simpleType>
</schema>

Câu trả lời:


71

ElementFormDefault không liên quan gì đến không gian tên của các loại trong lược đồ, nó liên quan đến không gian tên của các phần tử trong tài liệu XML tuân theo lược đồ.

Đây là phần liên quan của thông số kỹ thuật:

Element Declaration Schema

Component Property  {target namespace}
Representation      If form is present and its ·actual value· is qualified, 
                    or if form is absent and the ·actual value· of 
                    elementFormDefault on the <schema> ancestor is qualified, 
                    then the ·actual value· of the targetNamespace [attribute]
                    of the parent <schema> element information item, or 
                    ·absent· if there is none, otherwise ·absent·.

Điều đó có nghĩa là targetNamespace mà bạn đã khai báo ở đầu lược đồ chỉ áp dụng cho các phần tử trong tài liệu XML tuân thủ lược đồ nếu một trong hai phần tử elementFormDefault là "đủ điều kiện" hoặc phần tử được khai báo rõ ràng trong lược đồ là có form = "đủ điều kiện" .

Ví dụ: Nếu elementFormDefault không đủ tiêu chuẩn -

<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>

sẽ mong đợi các phần tử "name" nằm trong targetNamespace và các phần tử "page" ở trong namespace null.

Để tiết kiệm, bạn phải đặt form = "đủ điều kiện" trên mọi khai báo phần tử, việc nêu rõ elementFormDefault = "đủ điều kiện" có nghĩa là targetNamespace áp dụng cho từng phần tử trừ khi bị ghi đè bằng cách đặt form = "unqu Đủ điều kiện" trên khai báo phần tử.


Mặc dù câu trả lời này đề cập đến thông số kỹ thuật nhưng nó không giải thích nó một cách chính xác. Các phần tử được xác định cục bộ vẫn nằm trong targetNamespace và không bao giờ ở trong namespace rỗng. elementFormDefault chỉ là một công tắc chỉ định xem bạn có phải không gian tên đủ điều kiện cho chúng trong một trường hợp hay không.
Ihe Onwuka

1
@ Ihe, điều đó không chính xác: hoặc ở bất kỳ mức độ nào, nó có thể gây nhầm lẫn cho mọi người. Nếu khai báo phần tử cục bộ không có form = đủ điều kiện, thì thuộc tính {target namespace} của thành phần lược đồ khai báo phần tử là "vắng mặt" và điều đó có nghĩa là thuộc tính URI không gian tên của cá thể phần tử cũng phải "vắng mặt.
Michael Kay

@MichaelKay Đối với tôi điều đó còn khó hiểu hơn. Câu hỏi đặt ra là liệu trong trang ví dụ có nằm trong không gian tên rỗng hay không, bởi vì nếu đó là lý do tại sao thông số không đơn giản nói rằng setting elementFormDefault = unqu đủ điều kiện đặt các phần tử được xác định cục bộ trong không gian tên rỗng. Nói rằng trang đó không được có không gian tên đủ điều kiện trong một trường hợp, điều tương tự như nói rằng trang không có không gian tên cos nếu đó là lý do tại sao spec không đơn giản nói điều đó và tại sao một lược đồ với targetNamespace xác thực những thứ không trong không gian tên đó?
Ihe Onwuka

1
Nó không "chỉ đơn giản nói rằng" bởi vì bạn đang mô tả nó một cách rất chính thống: cụm từ "đặt một phần tử trong không gian tên rỗng" không sử dụng thuật ngữ của đặc tả XSD; đặc tả thích sử dụng thuật ngữ cẩn thận hơn nhiều, thường gây khó đọc nhưng cuối cùng lại chính xác hơn rất nhiều.
Michael Kay

1
Theo như tôi liên quan, đó là một câu trả lời chính xác như đã viết.
Michael Kay

60

Hãy xem xét loại ComplexType sau AuthorTypeđược authorphần tử sử dụng

<xsd:complexType name="AuthorType">
  <!-- compositor goes here -->
  <xsd:sequence>
     <xsd:element name="name" type="xsd:string"/>
     <xsd:element name="phone" type="tns:Phone"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="tns:AuthorId"/>
</xsd:complexType>
<xsd:element name="author" type="tns:AuthorType"/>

Nếu elementFormDefault="unqualified"

thì Phiên bản XML sau là hợp lệ

<x:author xmlns:x="http://example.org/publishing">
   <name>Aaron Skonnard</name>
   <phone>(801)390-4552</phone>
</x:author>

thuộc tính tên của tác giả được phép mà không chỉ định vùng tên (không đủ tiêu chuẩn). Bất kỳ phần tử nào là một phần của <xsd:complexType>đều được coi là cục bộ của complexType.

nếu elementFormDefault="qualified"

thì phiên bản phải có các phần tử cục bộ đủ điều kiện

<x:author xmlns:x="http://example.org/publishing">
   <x:name>Aaron Skonnard</name>
   <x:phone>(801)390-4552</phone>
</x:author>

vui lòng tham khảo liên kết này để biết thêm chi tiết


55

Câu trả lời và giải thích mới, chi tiết cho một câu hỏi cũ, thường gặp ...

Câu trả lời ngắn gọn : Nếu bạn không thêm elementFormDefault="qualified"vào xsd:schema, thì unqualifiedgiá trị mặc định có nghĩa là các phần tử được khai báo cục bộ không có trong không gian tên .

Có rất nhiều sự nhầm lẫn về những gì elementFormDefaultkhông, nhưng điều này có thể nhanh chóng được làm rõ với một ví dụ ngắn ...

Phiên bản hợp lý hóa XSD của bạn:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignment" type="target:assignmentInfo" 
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
</schema>

Những điểm chính:

  • Phần assignmenttử được xác định cục bộ.
  • Các phần tử được xác định cục bộ trong XSD không nằm trong vùng tên theo mặc định.
    • Điều này là do giá trị mặc định cho elementFormDefaultunqualified.
    • Đây được cho là một lỗi thiết kế của những người tạo ra XSD.
    • Thực hành tiêu chuẩn là luôn sử dụng elementFormDefault="qualified" để nó assignmentnằm trong không gian tên đích như người ta mong đợi.
  • Nó là một formthuộc tính hiếm khi được sử dụng trên các xs:elementkhai báo elementFormDefaultthiết lập các giá trị mặc định.

XML có vẻ hợp lệ

XML này có vẻ như nó phải hợp lệ theo XSD ở trên:

<assignments xmlns="http://www.levijackson.net/web340/ns"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.levijackson.net/web340/ns try.xsd">
  <assignment id="a1">
    <name>John</name>
  </assignment>
</assignments>

Để ý:

  • Không gian tên mặc định trên các assignmentsđịa điểm assignmentsvà tất cả các con của nó trong không gian tên mặc định ( http://www.levijackson.net/web340/ns).

Lỗi xác thực ghép nối

Mặc dù có vẻ hợp lệ, nhưng XML ở trên vẫn tạo ra lỗi xác thực khó hiểu sau:

[Lỗi] try.xml: 4: 23: cvc-complex-type.2.4.a: Nội dung không hợp lệ được tìm thấy bắt đầu bằng phần tử 'gán'. Dự kiến ​​sẽ có một trong số '{gán}'.

Ghi chú:

  • Bạn sẽ không phải là nhà phát triển đầu tiên nguyền rủa chẩn đoán này dường như nói rằng nội dung không hợp lệ vì nó mong đợi tìm thấy một assignmentphần tử nhưng nó thực sự tìm thấy một assignmentphần tử. ( WTF )
  • Điều này thực sự có nghĩa là gì: Xung quanh {}xung quanh assignmentcó nghĩa là xác thực đã được mong đợiassignment trong không gian tên ở đây. Thật không may, khi nó nói rằng nó đã tìm thấy mộtassignmentphần tử, nó không đề cập rằng nó đã tìm thấy nó trong một không gian tên mặc định khác với không gian tên không.

Giải pháp

  • Phần lớn thời gian: Thêm elementFormDefault="qualified"vào xsd:schemaphần tử của XSD. Điều này có nghĩa là XML hợp lệ phải đặt các phần tử trong không gian tên đích khi được khai báo cục bộ trong XSD; nếu không, XML hợp lệ phải đặt các phần tử được khai báo cục bộ trong không gian tên.
  • Rất ít thời gian: Thay đổi XML để tuân thủ yêu cầu của XSD là assignmentkhông có không gian tên. Điều này có thể đạt được, ví dụ, bằng cách thêm xmlns=""vàoassignment phần tử.

Tín dụng: Cảm ơn Michael Kay vì phản hồi hữu ích về câu trả lời này.


12

Điều quan trọng cần lưu ý với elementFormDefault là nó áp dụng cho cục bộ các phần tử được xác định , thường là các phần tử được đặt tên bên trong khối complexType, trái ngược với các phần tử toàn cục được xác định ở cấp cao nhất của lược đồ. Với elementFormDefault = "đủ điều kiện", bạn có thể giải quyết các phần tử cục bộ trong lược đồ từ bên trong tài liệu xml bằng cách sử dụng không gian tên đích của lược đồ làm không gian tên mặc định của tài liệu.

Trên thực tế, hãy sử dụng elementFormDefault = "đủ điều kiện" để có thể khai báo các phần tử trong các khối lồng nhau, nếu không, bạn sẽ phải khai báo tất cả các phần tử ở cấp cao nhất và tham chiếu chúng trong lược đồ trong các phần tử lồng nhau bằng thuộc tính ref, dẫn đến lược đồ nhỏ gọn hơn nhiều.

Bit này trong Sơ đồ lược đồ XML nói về nó: http://www.w3.org/TR/xmlschema-0/#NS


Làm rõ một chút về câu trả lời chính xác nhất. Với elementFormDefault = đủ điều kiện, bạn phải không gian tên đủ điều kiện cho các phần tử cục bộ trong nội dung. Với nó được đặt thành không đủ điều kiện, bạn không được phép không gian tên đủ điều kiện cho chúng.
Ihe Onwuka

6

elementFormDefault = "đủ điều kiện" được sử dụng để kiểm soát việc sử dụng không gian tên trong tài liệu phiên bản XML (tệp .xml), thay vì không gian tên trong chính tài liệu lược đồ (tệp .xsd).

Bằng cách chỉ định elementFormDefault = "đủ điều kiện", chúng tôi thực thi khai báo không gian tên được sử dụng trong các tài liệu được xác thực bằng lược đồ này.

Thông thường khi chỉ định giá trị này để tuyên bố rằng các phần tử phải đủ tiêu chuẩn thay vì không đủ tiêu chuẩn. Tuy nhiên, vì thuộc tínhFormDefault = "không đủ tiêu chuẩn" là giá trị mặc định, nó không cần phải được chỉ định trong tài liệu lược đồ, nếu người ta không muốn đủ điều kiện cho các không gian tên.


elementFormDefault chỉ áp dụng cho các phần tử được xác định cục bộ. Các phần tử toàn cầu phải được đặt trong không gian tên đủ điều kiện.
Ihe Onwuka

0

Tôi nhận thấy rằng XMLSpy (ít nhất là phiên bản 2011) cần một targetNameSpace được xác định nếu sử dụng elementFormDefault = "đủ điều kiện". Nếu không sẽ không xác thực. Và cũng sẽ không tạo xmls với tiền tố không gian tên

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.