2016-04-21 14 views
3

Wie kann ich ein XSD 1.1-Schema automatisch in ein XSD 1.0-Schema konvertieren, indem Sie alle 1.1 Features entfernen und nur die mit XSD 1.0 kompatible Teilmenge belassen?Konvertieren Sie programmgesteuert ein XSD 1.1-Schema in XSD 1.0?

Ich weiß, dass dies Beschränkungen auferlegen würde, wie viele XSD 1.1-Funktionen Sie nutzen könnten, aber der Anwendungsfall, den ich mir vorstelle, ist ein Schema, in dem Sie sowohl eine XSD 1.1-Version als auch eine kompatible XSD 1.0-Version veröffentlichen. beide beschreiben die gleiche Datenstruktur, aber mit der Version 1.1 mit ein paar zusätzlichen <assert> Datenintegritätsprüfungen.

Antwort

1

Wenn Sie sich die Veröffentlichung eines 1.1-Schemas und eines zugehörigen 1.0-Schemas vorstellen, ist der einfachste und beste Weg die Verwendung des in der XSD 1.1-Spezifikation beschriebenen vc: -Namespace. Sie können den vc: -Namespace verwenden, um 1.1-Features wie die von Ihnen genannten Asserments (oder die Deklarationen, die sie enthalten) zu markieren und 1.0 Äquivalente oder nahezu gleichwertige Elemente anzugeben.

Wir diese verwenden können, die xs:assert in einem Beispiel aus der XSD-1.1-Spezifikation als 1.1-only-Funktion zu markieren:

<xs:complexType name="arrayType"> 
<xs:sequence> 
    <xs:element name="entry" minOccurs="0" maxOccurs="unbounded"/> 
</xs:sequence> 
<xs:attribute name="length" type="xs:int"/> 
<xs:assert test="@length eq fn:count(./entry)" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
    vc:minVersion="1.1"/> 
</xs:complexType> 

All XSD 1.1 Prozessor erforderlich, um die vc zu verstehen: Namensraum und filtert das Schema Dokumentiere entsprechend (akzeptiere Dinge mit vc: minVersion kleiner oder gleich 1.1 oder vc: maxVersion größer als 1.1, und so weiter). Daher kann das Schemadokument mit den Attributen vc: * als 1.1-Schema ausgeliefert werden.

Ein konformer 1.0 Prozessor könnte aktualisiert werden, um den VC zu verstehen: Namespace, aber ich weiß nicht von irgendwelchen, die gewesen sind. Für die Verwendung von 1.0-Prozessoren muss das Schemadokument gefiltert werden, bevor es angezeigt wird.

Wie kjhughes glaube ich, dass ein XSLT Stylesheet wahrscheinlich die beste Wahl für diese Filterung ist. Die Verwendung des vc: * -Namespace macht es jedoch einfach, zuverlässig zu arbeiten, und es ist nicht erforderlich, dass der Schemaautor die Verwendung von 1.1-Features minimiert, um die Transformation zu vereinfachen.

Es ist einfach genug, ein Stylesheet zu schreiben, um die notwendige Filterung durchzuführen, aber in der Tat müssen Sie nicht: Es gibt eine XSLT 1.0 stylesheet, die den Job erledigt (vollständige Offenlegung; Ich schrieb es). Es gab auch eine funktionierende online demo, aber ich sehe, dass Bit-Rot eingestellt hat, und es scheint nicht in aktuellen Browsern zu arbeiten; Ich werde es reparieren, wenn ich Zeit habe. Die documentation kann immer noch nützlich sein.

1

Wie Sie erwarten, ist keine allgemeine Umwandlung von Fällen möglich. Angesichts der Tatsache, dass Sie die Kontrolle über die XSD v1.1 haben, gibt es Hoffnung. Appendix G.1 der XSD v1.1 Recommendation fasst die Änderungen im Vergleich zu XSD v1.0 zusammen. Kurz gesagt, verlassen Sie sich nicht auf neue Konstrukte oder Verhaltensweisen, die in Anhang G.1 beschrieben sind.

Wenn Sie alle Änderungen außer der Verwendung von xsd:assert klar bleiben, dass Sie erwähnt haben, Sie eine einfache XSLT-Transformation verwenden, könnte die Zuordnung von Ihrem v1.0 XSD auf Ihre v1.1 XSD zu halten:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="xsd:assert"/> 
</xsl:stylesheet>