Mit Hilfe von xslt zu transformieren mehrerer xml-schema-Dokumente
Habe ich eine Reihe von xml-schema-Dokumente, die verwendet werden, um zu beschreiben, Konfiguration von Einstellungen für meine Anwendung. Die xml-schemas Blick etwas entlang der folgenden Zeilen:
Client.xsd
<xsd:schema targetNamespace="http://www.example.com/network"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="Client">
<xsd:attribute name="Host" type="xsd:string>
</xsd:complexType>
</xsd:schema>
Server.xsd
<xsd:schema targetNamespace="http://www.example.com/network"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="Server">
<xsd:attribute name="Port" type="xsd:unsignedShort>
<xsd:attribute name="MaxConnections" type="xsd:int default="32">
</xsd:complexType>
</xsd:schema>
Anwendung.xsd
<xsd:schema targetNamespace="http://www.example.com/core"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="Application">
<xsd:attribute name="Name" type="xsd:string>
<xsd:attribute name="Id" type="xsd:int>
</xsd:complexType>
</xsd:schema>
FooClient.xsd
<xsd:schema targetNamespace="http://www.example.com/foo"
xmlns:core="network://www.example.com/network"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://www.example.com/network"
schemaLocation="client.xsd"/>
<xsd:complexType name="FooClient">
<xsd:complexContent>
<xsd:extension base="network:Client">
<xsd:attribute name="foo" type="xsd:string"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
FooServer.xsd
<xsd:schema targetNamespace="http://www.example.com/foo"
xmlns:core="network://www.example.com/network"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://www.example.com/network"
schemaLocation="client.xsd"/>
<xsd:complexType name="FooServer">
<xsd:complexContent>
<xsd:extension base="network:Server">
<xsd:attribute name="foo" type="xsd:string"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
FooApplication.xsd
<xsd:schema targetNamespace="http://www.example.com/foo"
xmlns:core="http://www.example.com/core"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://www.example.com/core"
schemaLocation="Application.xsd"/>
<xsd:include schemaLocation="FooClient.xsd"/>
<xsd:include schemaLocation="FooServer.xsd"/>
<xsd:complexType name="FooApplication">
<xsd:complexContent>
<xsd:extension base="core:Application">
<xsd:sequence>
<xsd:element name="FooInput" type="FooClient"/>
<xsd:element name="FooOutput" type="FooServer"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="Foo" type="FooApplication"/>
</xsd:schema>
Dies ist ein Beispiel für eine Instanz-Dokument:
<foo:Foo xmlns:foo="http://www.example.com/foo"
Id="1234"
Name="FooInstance1">
<FooInput Host="localhost:12345"
Name="Input"
foo="bar"/>
<FooOutput Port="54321"
Name="Output"
foo="bar"/>
</foo:Foo>
Mein Ziel ist es, den FooApplication-schema-Dokument und schalten Sie ihn in eine lesbare form, so dass die Menschen, die verantwortlich für die Aufrechterhaltung der Anwendung genau wissen, welche Konfigurations-Optionen, die verfügbar sind, werden die Datentypen, default-Werte, etc. Schließlich will ich hinzufügen-Dokumentation-Elemente können auch Hinzugefügt werden, um den Ausgang, aber jetzt bin ich versucht es einfach zu halten. Also das Beispiel oben könnte etwa so Aussehen:
FooApplication/Id, int
FooApplication/Name, string
FooApplication/FooInput/Host, string
FooApplication/FooInput/foo, string
FooApplication/FooOutput/Port, unsignedShort
FooApplication/FooOutput/MaxConnections, int, default=32
FooApplication/FooOutput/foo, string
Für diese Aufgabe xslt scheint, wie die offensichtliche Werkzeug. Aber ich habe eine harte Zeit, meinen Kopf herum, wie Sie ziehen Daten aus mehreren Dokumenten. Ich habe versucht, so etwas wie dieses (zum Beispiel für die Indizierung alle Elemente complexType):
<xsl:template match="xsd:include">
<xsl:apply-templates select="document(@schemaLocation)"/>
</xsl:template>
<xsl:template match="xsd:import">
<xsl:apply-templates select="document(@schemaLocation)"/>
</xsl:template>
<xsl:key name="complexType" match="xsd:complexType" use="@name"/>
Jedoch, wenn Sie den Schlüssel, nur den complexType-von FooApplicaiton.xsd ist gelöst.
Hat jemand irgendwelche Erkenntnisse, wie dies erreicht werden könnte?
Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde anfangen, indem Sie einen Blick auf DocFlex und sehen, ob Ihre Herangehensweise an XML-Schema-Dokumentation für Sie sinnvoll ist. Sie sollten dann in der Lage sein zu skalieren nach oben oder unten. Für alles andere als trivial, wenn Sie würde haben, um bauen Sie Ihre eigenen doc-system, würde ich denken, dass es sein sollte, basierend auf einem XML-Schema Object Model API (XSOM), mit, dass die Erstellung von XML könnte dann vorgestellt werden mit XSLT...
Brauchen Sie nicht, um Prozess-schemas in irgendeiner Weise, außer für das erstellen der schemas besser.
Verwenden Sie die
xs:annotation
element und seine Kind -xs:documentation
so viel wie möglich in jedem Ort, woxs:annotation
darf.Dann können Sie Instanzen des Schemas(s) mit einem guten XML-editor wie Visual Studio XML-Editor und die IDE intellisense automatisch:
Dem XML-Editor auch markiert mit roten Wellenlinien Fehler und die Fehler-Fenster zeigt einen Fehler oder eine Warnung Nachrichten -- al in Echtzeit, während der Benutzer die Eingabe das XML-Dokument.
Schließlich: Wenn nach der Erstellung der Anmerkungen, die Sie immer noch wollen, etwas zu produzieren, wie eine separate (oder auch gedruckte) Dokumentation, können Sie leicht verarbeiten die schemas XSLT und nur die Ausgabe der verfügbaren Annotationen.
Dem Grund, dass xsl:key ist nicht für Sie arbeitet, ist, dass es sucht nur in einem einzigen Dokument. Die Lösung könnte sein, erstellen Sie ein composite-Dokumenten (xsl:variable), die verbindet die die Inhalte der verschiedenen schema-Dokumente, und verwenden Sie dann xsl:key, dass.
(Oder verwenden Sie Saxon-EE, die Indizes erstellen automatisch wo nötig ist, und vermeidet die Notwendigkeit für eindeutige Schlüssel.)
Allgemein, Bearbeiten von raw-schema-Dokumenten unter Verwendung von XSLT schwierig, weil es so viele verschiedene Arten des Schreibens, die gleiche Sache in XSD. Allerdings, wenn Sie haben die Kontrolle über den coding-Stil verwendet, in der schema-Dokumente, ist es durchaus möglich, zu erreichen.
Dank, Petru Gardea, für die Erwähnung unseres Tools
DocFlex/XML-XSDDoc!
Ja, in der Tat, mit unserem XML-schema-doc-gen ist es möglich, zu dokumentieren, gemeinsam alle Beispiele von XML-schemas erwähnt in der ersten Frage.
Hier ist so ein doc ich habe gerade von Ihnen erzeugt:
http://www.filigris.com/pr/stackoverflow.com/questions/8369677/using-xslt-to-transform-multiple-xml-schema-documents/xsddoc/
Aber ich muss sagen, dass die bereitgestellten XSD-Inserate sind etwas falsch. Wenn Sie diese Texte wörtlich und erstellen entsprechende XSD-Dateien, aus Ihnen nichts wird funktionieren! (Zur Generierung der doc, den ich brauchte, um Sie zu korrigieren.)
Ersten, die XML-markup in einigen schemas ist einfach ungültig (z.B. in der Anwendung.xsd).
Zweite, FooApplication.xsd verwendet die falsche Art von Referenzen.
Es definiert die Elemente 'FooInput' und 'FooOutput' mit der Art 'FooClient' und 'FooServer' entsprechend.
Diese Typen sind definiert in FooClient.xsd-und FooServer.xsd, die enthalten sind in FooApplication.xsd. Das ist in Ordnung.
Was hier fehlt ist, dass diejenigen Arten definiert, die in den Namensraum: "http://www.example.com/foo". Aber die XML-Standorten in FooApplication.xsd, wo Sie verwendet werden, gebunden sind, zu einem anderen namespace -- die Standardeinstellung (D. H. keine namespace). So, die Erklärung:
referes eigentlich nicht der Typ:
aber eher auf die Art:
Machen die Art Verweise korrigieren, müssen Sie fügen Sie eine weitere namespace-Bindung in <xsd:schema> in FooApplication.xsd:
oder verwenden Sie einen zusätzlichen namespace-Präfix gebunden "http://www.example.com/foo".
Also, wenn Sie jemals versucht, ein Dokument in Ihrem ursprünglichen schemas gerade mit unserem tool DocFlex/XML-XSDDoc, klar man erhalten würde, keine richtige Dokumentation!
(Unsere XML-schema-doc-gen nicht validieren ein XML-schema automatisch. Es kann einfach nicht, weil, Erstens, es ist nicht sein job, und zweitens, jede schema-Validierung würde zusätzliche Rechenzeit, was kann lästig sein, die meisten, die Sie sind sicher, Ihre Schemata korrekt sind. Nachdem alle, können Sie immer fügen Sie einige zusätzliche schema-Validierung Schritt in deinem build-Datei)
Schließlich, wenn alle oben gesagt, betrifft nicht Sie, - das heißt, alle diese Fehler in den Beispiel-schemas sind nur die Ungenauigkeiten dieser besonderen Frage-dann wäre es wirklich interessant zu hören, warum unser tool passt nicht zu deiner Aufgabe (neben jeglichen kommerziellen, finanziellen und organisatorischen Fragen).
Petru Gardea vorgeschlagen, dass unsere Lösung sein könnte "hochskaliert". Aber in welche Richtung, im Allgemeinen, kann es skaliert werden müssen bis? Das wäre echt interessant zu hören! Weil es gerade unsere eigenen Anliegen-wie machen unser tool XML-Dokument-schemas noch besser.
P. S.
Es gibt eine weitere Frage auf dieser Seite, was auch sehr zu diesem Thema:
Wie konvertieren von xsd zu menschlich lesbare Dokumentation?
Ich ein Antwort zu (obwohl manche betrachten es als eine umstrittene, vor allem von der mainstream-Sicht). Leider hatte ich nicht dieses Konto dann, so ich keine Beziehung habe, um es direkt.