2017-09-10 6 views
1

data-*のような動的属性名でXMLを検証する必要があります。今はRelaxNGスキーマを使用していますが、動的属性名はサポートしていません。オプションは何ですか?HTML5 data- *属性を使用してドキュメントを検証する方法

<?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

xmlの例を挙げることはできますか? –

+0

@RaymondNijlandはい、もちろん、私は私の質問を編集しました。 – Pavel

答えて

4

前処理を行い、検証機能にそれを与える前data-*属性をドロップするXML:私は... XMLの

例を、関連する何かを見つけることができません。そうしないと、RelaxNGやその他の文法ベースのスキーマ言語で検証する方法がわかりません。

限りXMLを前処理として、既存のXMLツールチェーンであることを行うための一つの方法は、次のようになります。data-*属性をドロップしますがそのままである他のすべてに合格XSLT変換を通してそれを実行します。

<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> 

<xsl:template match="@*[starts-with(name(), 'data-')]"/>はそこで重要な部分です。その結果、data-*属性が床に落とされるだけです。残りのXSLスタイルシートは、ソースXMLからのすべてのものをそのまま渡す基本的な「識別変換」です。

W3C Nu Html Checker(HTML5バリデータ)バックエンドは、機能的にはXSLT変換と同じですが、Javaで書かれたdata-*属性のものを実行します。あなたは好奇心旺盛であれば、そのためのコードはthe GitHub repo for the W3C Nu Html Checker sources内にある、ここに:

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

the filterAttributes code in DataAttributeDroppingContentHandlerWrapper.java

を参照してください。それは本質的に前に検証関数への解析時に解析イベントをオフに働くSAXフィルターです。

そして、あなたもより興味があれば、同様のことをやって、他の前処理フィルタのためのコードがある:the accompanying RelaxNG grammarはから要素を可能にすることを特別な名前空間にそれらを置くことによって

でそれらtemplateサブツリーにチェックしない持っている必要はありません、あなたは一般的なアイデアを得る:あなたは検証ロジックを表現することはできませんあなたのソースのマークアップ構文のいずれかの例がある場合RelaxNGまたはXSDの場合、基本的にソースをフィルタリング(前処理)して、検証機能からそのマークアップを非表示にします。

関連する問題