2017-09-10 6 views
1

Ich muss XML mit dynamischen Attributnamen wie data-* validieren. Jetzt benutze ich das RelaxNG-Schema, aber dynamische Attributnamen werden nicht unterstützt. Wie lauten die Optionen? Ich kann nichts relevant finden ..Wie validiere ich Dokumente mit HTML5-Datenattributen?

Beispiel für XML:

<?xml version="1.0" encoding="utf-8"?> 
<body xml:lang="cs" ns="www.x.y"> 
    <h id="x" ctime="2017-09">Heading..</h> 
    <desc kw="kw">Desc..</desc> 
    <section> 
    <h data-foo="bar" id="one" short="One">First heading</h> 
    <desc>Desc...</desc> 
    <p>Content..</p> 
    <ul data-buz="fuz"> 
     <li data-switch="click">list item</li> 
     <li>list item 2</li> 
    </ul> 
    </section> 
</body> 
+0

Können Sie ein Beispiel aus diesem XML geben? –

+0

@RaymondNijland Ja, natürlich habe ich meine Frage bearbeitet. – Pavel

Antwort

4

Preprocess die XML die data-* Attribute zu löschen, bevor es auf die Validierungsfunktion zu geben. Ansonsten kann ich es nicht mit RelaxNG oder anderen grammatikbasierten Schemasprachen validieren.

Soweit die XML-Vorverarbeitung, eine Möglichkeit, das zu tun, mit einem vorhandenen XML-Toolchain wäre: es durch eine XSLT-Transformation ausführen, die die data-* Attribute fällt aber auf alles andere geht, wie sie ist:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'> 
    <xsl:output method="xml" indent="no"/> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@*[starts-with(name(), 'data-')]"/> 
</xsl:stylesheet> 

Die <xsl:template match="@*[starts-with(name(), 'data-')]"/> ist der wichtige Teil dort. Das bewirkt, dass alle data-* Attribute einfach auf den Boden fallen gelassen werden. Der Rest dieses XSL-Stylesheets ist nur eine grundlegende "identify-Transformation", die alles andere aus dem XML-Quelltext unverändert weitergibt.

Der W3C Nu Html Checker (HTML5 Validator) Backend tut etwas für data-* Attribute, die funktionell das gleiche wie die XSLT-Transformation ist, aber in Java geschrieben. Wenn Sie neugierig sind, ist der Code für sie innerhalb the GitHub repo for the W3C Nu Html Checker sources, hier:

https://github.com/validator/validator/tree/master/src/nu/validator/xml/dataattributes

Siehe the filterAttributes code in DataAttributeDroppingContentHandlerWrapper.java

Es ist im Wesentlichen ein SAX-Filter, der vor der Validierungsfunktion zur Analysezeit off Parse-Ereignisse arbeitet.

Und wenn Sie noch mehr neugierig, gibt es Code für andere Vorverarbeitung Filter, die ähnliche Dinge:

Wie auch immer, erhalten Sie die allgemeine Idee: Wenn es irgendwelche Fälle von Markup-Konstrukte in Ihrer Quelle sind, dass Sie nicht Validierungslogik ausdrücken In RelaxNG oder XSD filtern Sie die Quelle im Wesentlichen (vorverarbeiten), um das Markup von der Validierungsfunktion auszublenden.