XSD 元素替换(Element Substitution)

Με το XML Schema, ένα στοιχείο μπορεί να αντικαταστήσει ένα άλλο στοιχείο.

Αντικατάσταση στοιχείων

Ας δώσουμε ένα παράδειγμα: οι χρήστες μας προέρχονται από την Αγγλία και τη Νορβηγία. Ελπίζουμε να έχουμε την ικανότητα να επιλέγουν οι χρήστες να χρησιμοποιούν τα ονόματα των στοιχείων στα νορβηγικά ή στα αγγλικά στο έγγραφο XML.

Για να λύσουμε αυτό το πρόβλημα, μπορούμε να ορίσουμε ένα στοιχείο στο XML schema. substitutionGroupΠρώτα, αναφέρουμε τον κύριο στοιχείο και στη συνέχεια αναφέρουμε τα δευτερεύοντα στοιχεία, τα οποία μπορούν να αναφέρουν ότι μπορούν να αντικαταστήσουν το κύριο στοιχείο.

<xs:element name="name" type="xs:string"/>
<xs:element name="navn"}} substitutionGroup="name"/>

Στο παραπάνω παράδειγμα, το στοιχείο "name" είναι το κύριο στοιχείο, ενώ το στοιχείο "navn" μπορεί να αντικαταστήσει το στοιχείο "name".

Δείτε ένα κομμάτι από ένα XML schema:

<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
<xs:complexType name="custinfo">
  <xs:sequence>
    <xs:element ref="name"/>
  </xs:sequence>
</xs:complexType>
<xs:element name="customer" type="custinfo"/>
<xs:element name="kunde" substitutionGroup="customer"/>

Ένα νόμιμο έγγραφο XML πρέπει να μοιάζει με αυτό (κατά βάση του παραπάνω σχήματος):

<customer>
  <name>John Smith</name>
</customer>

ή κάτι σαν αυτό:

<kunde>
  <navn>John Smith</navn>
</kunde>

Αποτροπή αντικατάστασης στοιχείων

Για να αποτρέψετε την αντικατάσταση άλλων στοιχείων από ένα συγκεκριμένο στοιχείο, χρησιμοποιήστε την ιδιότητα block:

<xs:element name="name" type="xs:string" block="substitution"/>

Δείτε ένα κομμάτι από ένα XML schema:

<xs:element name="name" type="xs:string" block="substitution"/>
<xs:element name="navn" substitutionGroup="name"/>
<xs:complexType name="custinfo">
  <xs:sequence>
    <xs:element ref="name"/>
  </xs:sequence>
</xs:complexType>
<xs:element name="customer" type="custinfo" block="substitution"/>
<xs:element name="kunde" substitutionGroup="customer"/>

Ένα νόμιμο έγγραφο XML πρέπει να μοιάζει με αυτό (κατά βάση του παραπάνω σχήματος):

<customer>
  <name>John Smith</name>
</customer>

Αλλά το παρακάτω έγγραφο δεν είναι νόμιμο:

<kunde>
  <navn>John Smith</navn>
</kunde>

Χρήση του substitutionGroup

Ο τύπος του αντικειμένου αντικατάστασης πρέπει να είναι ο ίδιος με τον κύριο τύπο ή να προέρχεται από τον κύριο τύπο. Αν ο τύπος του αντικειμένου αντικατάστασης είναι ο ίδιος με τον τύπο του κύριου αντικειμένου, τότε δεν χρειάζεται να καθορίσετε τον τύπο του αντικειμένου αντικατάστασης.

请注意,substitutionGroup 中的所有元素(主元素和可替换元素)必须被声明为全局元素,否则就无法工作!

什么是全局元素(Global Elements)?

全局元素指 "schema" 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。