ονομάτων XML και τα χαρακτηριστικά

ψήφοι
38

Προσπαθώ να κατανοήσουν πώς λειτουργούν χώροι ονομάτων σε XML. Όταν έχω ένα στοιχείο, όπως foo: bar, τα χαρακτηριστικά θα συχνά δεν έχουν ονομάτων τους. Αλλά μερικές φορές θα το κάνουν. Είναι το χαρακτηριστικό στο χώρο ονομάτων του στοιχείου, ακόμα και όταν έχει κηρυχθεί η προεπιλεγμένη χώρο ονομάτων; Κοιτάζοντας πέρα ​​από το xsd για XHTML φαίνεται ότι οι ιδιότητες είναι μέρος του σχήματος και θα πρέπει να είναι στο χώρο ονομάτων για XHTML, αλλά ποτέ δεν παρουσιάζονται με αυτόν τον τρόπο ...

Δημοσιεύθηκε 03/09/2008 στις 11:34
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
2

Διαβάστε επάνω σε 6,1 χώρου ονομάτων Φέροντος και 6,2 χώρου ονομάτων Αθέτησης στο W3C.

Βασικα:

Το πεδίο εφαρμογής της δήλωσης χώρου ονομάτων δηλώνοντας ένα πρόθεμα εκτείνεται από την αρχή της έναρξης-tag με την οποία εμφανίζεται στο τέλος του αντίστοιχου άκρου-tag

Ωστόσο, το κείμενο εδώ δεν φαίνεται να εξηγήσει αν σημαίνει είναι foo: ένα ή το προεπιλεγμένο namespace στο πλαίσιο. Θα ήθελα να υποθέσουμε ότι δεν αναφέρεται σε foo: ένα, αλλά μάλλον η έγγραφα default namespace ένα. Λαμβάνοντας υπόψη αυτό το απόσπασμα τουλάχιστον:

Μια τέτοια δήλωση namespace ισχύει για όλα τα ονόματα στοιχείων και χαρακτηριστικών στο πεδίο εφαρμογής της το πρόθεμα των οποίων ταιριάζει με αυτό που καθορίζεται στη δήλωση.

Δηλαδή. ο χώρος ονομάτων «foo:» ισχύει μόνο για τα στοιχεία πρόθεμα foo:

Απαντήθηκε 03/09/2008 στις 11:43
πηγή χρήστη

ψήφοι
11

Παραδείγματα για την απεικόνιση χρησιμοποιώντας την σημειογραφία Clark , όπου το πρόθεμα χώρου ονομάτων αντικαθίσταται με τη διεύθυνση URL χώρο ονομάτων σε αγκύλες:

<bar xmlns:foo="http://www.foo.com/"
    foo:baz="baz"
    qux="qux"/>
<bar xmlns="http://www.foo.com/" xmlns:foo="http://www.foo.com/"
    foo:baz="baz"
    qux="qux"/>
<foo:bar xmlns="http://www.foo.com/" xmlns:foo="http://www.foo.com/"
    foo:baz="baz"
    qux="qux"/>

είναι

<{}bar
    {http://www.foo.com/}baz="baz"
    {}qux="qux"/>
<{http://www.foo.com/}bar
    {http://www.foo.com/}baz="baz"
    {}qux="qux"/>
<{http://www.foo.com/}bar
    {http://www.foo.com/}baz="baz"
    {}qux="qux"/>
Απαντήθηκε 04/09/2008 στις 04:46
πηγή χρήστη

ψήφοι
47

Τις περισσότερες φορές, τα χαρακτηριστικά δεν θα είναι σε καμία namespace. Το spec namespace λέει ( έμφαση δική μου):

Μια δήλωση default namespace ισχύει για όλους χωρίς πρόθεμα στοιχείο ονόματα στο πεδίο εφαρμογής της. Δηλώσεις Προεπιλογή ονομάτων δεν δεν ισχύουν άμεσα για να αποδώσει ονόματα? η ερμηνεία του χωρίς πρόθεμα ιδιοτήτων καθορίζεται από το στοιχείο επί του οποίου εμφανίζονται.

Υπάρχει ένας λόγος που οι περισσότεροι λεξιλόγια XML χρησιμοποιούν μη-namespaced χαρακτηριστικά:
Όταν τα στοιχεία σας έχουν ένα χώρο ονομάτων και αυτά τα στοιχεία έχουν τα χαρακτηριστικά, τότε δεν μπορεί να υπάρξει σύγχυση: οι ιδιότητες ανήκουν στο στοιχείο σας, η οποία ανήκει στον χώρο ονομάτων σας. Προσθέτοντας ένα πρόθεμα namespace για τα χαρακτηριστικά θα κάνουν ακριβώς ό, τι πιο φλύαρη.

Έτσι, υπάρχουν γιατί namespaced ιδιότητες;
Επειδή μερικοί λεξιλόγια κάνει χρήσιμο έργο με ως επί το πλείστον ιδιότητες, και μπορεί να κάνει αυτό όταν αναμιγνύεται με άλλα λεξιλόγια. Το πιο γνωστό παράδειγμα είναι XLink .

Τέλος, W3C XML Schema έχει ένα πολύ εύκολο τρόπο ( <schema attributeFormDefault="qualified">) του δηλώνοντας χαρακτηριστικά σας, όπως είναι σε ένα χώρο ονομάτων, αναγκάζοντάς σας να τους πρόθεμα στα έγγραφά σας, ακόμα και όταν χρησιμοποιείτε ένα προεπιλεγμένο χώρο ονομάτων.

Απαντήθηκε 05/09/2008 στις 19:52
πηγή χρήστη

ψήφοι
8

Υπάρχει κάτι που σχετίζονται με αυτό το αποδίδει / χώρους ονομάτων θέμα που μου πήρε λίγο χρόνο για να κατανοήσουν σήμερα, όταν δούλευα σε ένα XSD. Πάω να μοιραστώ αυτή την εμπειρία μαζί σας σε περίπτωση που κάποιος θα συμβεί ποτέ να έχουν τα ίδια προβλήματα.

Στο έγγραφο Schema δούλευα υπήρχαν ένα ζευγάρι των παγκόσμιων χαρακτηριστικά αναφέρεται από ορισμένα στοιχεία. Για να απλοποιήσουμε τα πράγματα εδώ ας υποθέσουμε ότι αυτό το XSD μιλάω ήταν για ένα πελάτη .

Ας το ονομάσουμε ένα από αυτά τα παγκόσμια χαρακτηριστικά Id . Και το στοιχείο ρίζας χρησιμοποιώντας πελατών

Δήλωση XSD μου έμοιαζε με αυτό:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema  xmlns="http://schemas.mycompany.com/Customer/V1" 
targetNamespace="http://schemas.mycompany.com/Customer/V1" 
xmlns:xs="http://www.w3.org/2001/XMLSchema">

Μου ταυτότητα δήλωση χαρακτηριστικό έμοιαζε με αυτό:

<xs:attribute name="Id" type="xs:positiveInteger"/>

Και μου Πελατών στοιχείο που χρησιμοποιείται το χαρακτηριστικό σαν αυτό:

<xs:element name="Customer">
   <xs:complexType>
      <xs:attribute ref="Id" use="required"/>
      <!-- some elements here -->
    </xs:complexType>
</xs:element>

Τώρα, ας πούμε ήθελα να κηρύξει Πελατών έγγραφο XML σαν αυτό:

<?xml version="1.0" encoding="utf-8"?>
<Customer Id="1" xmlns="http://schemas.mycompany.com/Customer/V1">
  <!-- ... other elements here -->
</Customer>

Ανακάλυψα ότι δεν μπορώ: όταν το χαρακτηριστικό είναι παγκοσμίως δηλωθεί, δεν είναι στον ίδιο χώρο ονομάτων από το στοιχείο που αναφέρεται.

Έχω καταλάβει ότι η μόνη λύση με την XSD ορίζεται έτσι ήταν να δηλώσετε το χώρο ονομάτων δύο φορές: μία φορά χωρίς πρόθεμα για να το κάνει το προεπιλεγμένο χώρο ονομάτων για τα στοιχεία, και μια φορά με ένα πρόθεμα για να το χρησιμοποιήσετε με τα χαρακτηριστικά. Έτσι, αυτό είναι το πώς θα έμοιαζε:

<?xml version="1.0" encoding="utf-8"?>
<Customer cus:Id="1" xmlns="http://schemas.mycompany.com/Customer/V1"
 xmlns:cus="http://schemas.mycompany.com/Customer/V1">
  <!-- ... other elements here -->
</Customer>

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

<xs:element name="Customer">
   <xs:complexType>
       <xs:attribute name="Id" type="xs:positiveInteger" use="required"/>
       <!-- some elements here -->
   </xs:complexType>
</xs:element>

Μου ήταν δύσκολο να βρούμε κάποιες αναφορές για το τι μιλάω εδώ στο δίχτυ. Βρήκα τελικά αυτό το post στο XSD Φόρουμ Stylus όπου ένας τύπος που ονομάζεται Steen Lehmann πρότεινε είτε να κηρύξει την ιδιότητα τοπικά ή να το δηλώσει μέσα σε μια ομάδα χαρακτηριστικό

«Έτσι ώστε η ίδια η δήλωση χαρακτηριστικό δεν είναι πλέον παγκόσμια»

Αυτή η τελευταία λύση έχει «hacky» γεύση, γι 'αυτό ακριβώς αποφάσισε να κολλήσει με την πρώτη λύση και να δηλώνουν όλα τα χαρακτηριστικά μου σε τοπικό επίπεδο.

Απαντήθηκε 24/10/2008 στις 22:04
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more