2017-03-08 4 views
1

In diesem Thema möchte ich viel mehr Gehirnzellen als ich allein anbieten können. Ich möchte meine XSD (v1.0) abhängig von den verwendeten/nicht verwendeten Elementen in realen XML-Instanzen (nur einzelne Namespaces) umgestalten. Lassen Sie uns bauen ein kleines Szenario:Bericht alle nicht verwendeten Elemente (+ Attribute) des entsprechenden Schemas

ich nur gültige XML-Dokumente gegen ein entsprechendes Schema haben:

<body> 
    <h1>Heading 1</h1> 
    <p>paragraph</p> 
    <p><bold>bold</bold>paragraph<italic>italic</italic></p> 
</body> 

XSD zu validieren gegen:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="body"> 
    <xs:complexType> 
     <xs:choice maxOccurs="unbounded"> 
     <xs:element ref="h1"/> 
     <xs:element ref="h2"/> 
     <xs:element ref="p"/> 
     <xs:element ref="span"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="h1" type="xs:string"/> 
    <xs:element name="h2" type="xs:string"/> 
    <xs:element name="p"> 
    <xs:complexType mixed="true"> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element ref="bold"/> 
     <xs:element ref="italic"/> 
     <xs:element ref="underline"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="span"> 
    <xs:complexType mixed="true"> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element ref="bold"/> 
     <xs:element ref="italic"/> 
     <xs:element ref="underline"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="bold" type="xs:NCName"/> 
    <xs:element name="italic" type="xs:NCName"/> 
    <xs:element name="underline" type="xs:NCName"/> 
</xs:schema> 

Auf dieser Basis würde ich gerne einen Bericht erstellen (via XSLT [2.0, 3.0 über SAXON EE 9.6.0.5 verfügbar]) über welche Elemente (Tags + Attribute) NICHT in meinen XML-Instanzen verwendet werden b ut sind in meinem XSD möglich.

vereinfachte Pseudo todos/Ausgehend von Grund auf neu:

  • Suche für alle //xs:element[@name] in meine XSD (Attribute in Bericht v2.0 folgen).
  • Suche für all * in meinem XML
  • "Vergleichen" es

Fragen:

Gibt es etwas über meinen Horizont zu diesem Thema in der schönen XSLT-Community schon?

Wie man es gut speichert und vergleicht?

Verwendung xsl:map über XSLT 3.0? Pfade speichern [/body/h1, /body/p] und diese Pfade vergleichen? (trickreich: die richtigen Pfade aus dem Schema holen, alle Möglichkeiten der Definitionen behandeln, wie xs:group ref="..." oder über complexTypes etc.)

[AddOn: Vielleicht muss ich es auf den Kontext von Vorgängerelementen in meinem XML erweitern. Im Beispielfall möchte ich könnte unterscheiden zwischen //p/underline und //span/underline.]

<xsl:message>please write your thoughts open minded. I don't request for fully functional code!</xsl:message>

Antwort

1

Blick in http://saxonica.com/html/documentation/functions/saxon/type.html und http://saxonica.com/html/documentation/functions/saxon/schema.html zu Schema Typinformationen in der Sächsischen EE auf Ihrem Knoten zu bekommen, ist, dass hoffentlich ein Weg, um zu vergleichen, Ihre Instanz für das Schema. Ich habe das nie benutzt, daher bin ich mir nicht sicher, wie weit Sie kommen werden. Ich bin mir sicher, wenn Sie die Frage zu Ihrer Frage hinzufügen, wird Michael Kay Ihnen zu gegebener Zeit einige bessere Einblicke geben.

+1

Danke bis jetzt, fügte das Tag für mächtigen Dr. Kay hinzu. – uL1

1

Ihr Beitrag hat mich an eine Option im Befehl com.saxonica.Validate erinnert: Durch Angabe von -stats: report.xml sollten Sie einen Bericht über die Verwendung von Schemakomponenten in Ihrem Instanzdokument erhalten. Es scheint, wird nicht in 9.7 arbeitet (und ich habe einen Fehler auf, dass angehoben), aber mit 9,5 Sie einen Bericht des Formulars erhalten:

<schemaCoverage> 
    <component kind="element" namespace="" name="PUB-DATE" count="6"/> 
    <component kind="complexType" namespace="" name="weightType" count="6"/> 
    <component kind="element" namespace="" name="PUBLISHER" count="6"/> 
    <component kind="element" namespace="" name="AUTHOR" count="6"/> 
    <component kind="element" namespace="" name="DIMENSIONS" count="6"/> 
    <component kind="simpleType" namespace="" name="languageType" count="6"/> 
    <component kind="element" namespace="" name="QUANTITY" count="6"/> 
    <component kind="element" namespace="" name="CATEGORY" count="3"/> 
    <component kind="complexType" 
       namespace="http://ns.saxonica.com/anonymous-type" 
       name="CATEGORIES_anonymous_type_1_at_line_23_of_books.xsd" 
       count="1"/> 
    <component kind="element" namespace="" name="LANGUAGE" count="6"/> 
    <component kind="element" namespace="" name="PAGES" count="6"/> 
    <component kind="complexType" namespace="" name="moneyType" count="6"/> 
    <component kind="element" namespace="" name="ISBN" count="6"/> 
    <component kind="simpleType" 
       namespace="http://www.w3.org/2001/XMLSchema" 
       name="IDREF" 
       count="6"/> 
    <component kind="simpleType" 
       namespace="http://www.w3.org/2001/XMLSchema" 
       name="ID" 
       count="3"/> 
    <component kind="complexType" 
       namespace="http://ns.saxonica.com/anonymous-type" 
       name="BOOKS_anonymous_type_1_at_line_14_of_books.xsd" 
       count="1"/> 
    <component kind="element" namespace="" name="CATEGORIES" count="1"/> 
    <component kind="simpleType" namespace="" name="ISBNType" count="6"/> 
    <component kind="simpleType" 
       namespace="http://www.w3.org/2001/XMLSchema" 
       name="string" 
       count="22"/> 
    <component kind="complexType" 
       namespace="http://ns.saxonica.com/anonymous-type" 
       name="ITEM_anonymous_type_1_at_line_39_of_books.xsd" 
       count="6"/> 
    <component kind="simpleType" namespace="" name="weightUnitType" count="6"/> 
    <component kind="complexType" 
       namespace="http://ns.saxonica.com/anonymous-type" 
       name="CATEGORY_anonymous_type_1_at_line_31_of_books.xsd" 
       count="3"/> 
    <component kind="simpleType" 
       namespace="http://www.w3.org/2001/XMLSchema" 
       name="date" 
       count="6"/> 
    <component kind="simpleType" 
       namespace="http://www.w3.org/2001/XMLSchema" 
       name="integer" 
       count="12"/> 
    <component kind="element" namespace="" name="TITLE" count="6"/> 
    <component kind="element" namespace="" name="PRICE" count="6"/> 
    <component kind="element" namespace="" name="WEIGHT" count="6"/> 
    <component kind="complexType" namespace="" name="dimensionsType" count="6"/> 
    <component kind="element" namespace="" name="ITEM" count="6"/> 
    <component kind="simpleType" namespace="" name="lengthUnitType" count="6"/> 
    <component kind="element" namespace="" name="BOOKS" count="1"/> 
</schemaCoverage> 

Dies scheint genau das zu sein, was Sie suchen.

1

Ich habe eine Übung wie diese für die XSLT 3.0 Testsuite gemacht. Sie können das Stylesheet finden Sie hier:

https://dvcs.w3.org/hg/xslt30-test/file/24e8b98b044b/tests/misc/catalog/catalog-007.xsl

Es dauert zwei Eingänge:

(a) die SCM-Datei mit com.saxonica.Validate mit der -scmout Option erzeugt wird, angewendet das Schema-for -xslt30. Die SCM-Datei ist eine Darstellung des kompilierten Schemas, das wesentlich einfacher aus XSLT zu analysieren ist als das ursprüngliche Quellschema. B) die Gruppe von nicht fehlerhaften Stylesheets in der Testsuite, die durch Durchsuchen der Testmetadaten ermittelt wurde Katalog rekursiv.

Es extrahiert die vom Schema erlaubte Menge von Element-Name/Attribut-Name-Paaren und extrahiert dann die in den Stylesheets tatsächlich vorhandenen Paare von Element-Name/Attribut-Name (jeweils gefiltert, z. B. zu berücksichtigen) nur Elemente im XSLT-Namespace). Anschließend vergleicht es die beiden Listen und meldet alle vom Schema zugelassenen Paare, die in einem Test-Stylesheet nicht vorhanden sind, sowie alle in einem Test-Stylesheet vorhandenen Paare, die vom Schema nicht zugelassen sind. Der Test wird nur bestanden, wenn beide Listen leer sind.

Verwandte Themen