2016-03-29 22 views

Antwort

3

XSD Erweiterung mit benutzerdefinierten Attributen kann, indem zuerst der Brauch in Ihrem eigenen Namensraum-Attributen erreicht werden, wie folgt:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://www.mycompany.com" 
      elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:attribute name="myAttribute" type="xs:boolean" default="true"/> 
</xs:schema> 

In diesem Namensraum, http://www.mycompany.com ein einziges Attribut myAttribute genannt definiert ist, mit einer Art von xs:boolean.

Als nächstes diesen Namensraum in Ihrem Zielschema verwendet, wie folgt:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:mc="http://www.mycompany.com" 
      xsi:schemaLocation="http://www.mycompany.com ./doc.xsd" 
      elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="element1" mc:myAttribute="false"/> 
</xs:schema> 

In diesem Beispiel ist das <schema> Element enthält Attribute, die den benutzerdefinierten Namespace (xmlns:mc="http://www.mycompany.com") und den Speicherort für die benutzerdefinierte Schemadatei definieren (xsi:schemaLocation="http://www.mycompany.com ./doc.xsd"). Das Zielschema enthält ein einzelnes Element und das oben definierte benutzerdefinierte Attribut myAttribute mit dem Wert "false". Beachten Sie, dass dem Namen des benutzerdefinierten Attributs das benutzerdefinierte Namespacepräfix vorangestellt ist. Beachten Sie außerdem, dass bei Verwendung eines ungültigen Werts (Beispiel: mc:myAttribute="invalid") ein Validierungsfehler generiert wird.

Dankeschön an @GhislainFourny und @kjhughes für Hilfe bei dieser Antwort.

0

Nein, Sie können nicht Ihre eigenen Komponenten zu einem XSD hinzufügen, ohne XSD Prozessoren verwirrend.

Zum Beispiel Xerces-J, beim Auftreffen auf Ihre benutzerdefiniertes Attribut Beispiel

<xs:element name="myElement" type="xs:string" myCustomAttribute="true" /> 

mit folgenden Fehlern reagiert:

[Fehler] try.xsd: 3: 59: s4s-att-not-allowed: Attribut 'myCustomAttribute' kann nicht im Element 'element' erscheinen.

Wenn Sie eine XSD erweitern möchten, verwenden Sie xsd:annotation/xsd:appinfo oder Attribute aus Ihrem eigenen Namensraum [Credit: @SpatialBridge]:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:myns="http://www.mycompany.com"> 
    <xs:element name="myElement" myns:myCustomAttribute="true"/> 
</xs:schema> 
+0

XMLSpy erzeugt auch einen Fehler. jedoch mit einem Namespace das Attribut Qualifikation scheint zu funktionieren: ' : Schema xmlns: xs =" http: // www. w3.org/2001/XMLSchema "xmlns: myns =" ​​http://www.mycompany.com "elementFormDefault =" qualifiziert "attributeFormDefault =" unqualifiziert "> \t \t ' –

+1

Ja, das wird auch funktionieren. Gute Idee. Antwort aktualisiert – kjhughes

+0

Warum ist das aber gültig? Ich habe keine Dokumentation gefunden, die das beantwortet. Es scheint nicht so, als ob das benutzerdefinierte Attribut tatsächlich im benutzerdefinierten Namespace definiert werden muss. Wenn ich meinen eigenen Namespace "importiere", wird kein Fehler ausgelöst, wenn das Attribut nicht definiert ist, oder zum Beispiel "type =" xs: integer "'. –

0

XBRL ist ein Beispiel für Technologien, die XML-Schema mit einer eigenen benutzerdefinierten Attribute erweitert.

Das folgende Beispiel stammt direkt aus der XBRL 2.1 specification. xbrli: balance und xbrli: periodType werden von XBRL über XML-Schema hinzugefügt.

<element 
    id="a2" 
    name="fixedAssets" 
    xbrli:balance="debit" 
    xbrli:periodType="instant" 
    type="xbrli:monetaryItemType" 
    substitutionGroup="xbrli:item"/> 

Als ob in kjhughes Antwort angegeben, müssen Sie Ihren eigenen Namensraum verwenden (in diesem Fall der xbrli Präfix wird mit http://www.xbrl.org/2003/instance gebunden).

Verwandte Themen