2017-09-10 38 views
1

我需要使用动态属性名称验证XML,如data-*。现在我使用RelaxNG模式,但它不支持动态属性名称。有什么选择?我找不到任何有关XML ..的如何使用HTML5数据属性验证文档?

例子:

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

预处理XML给它的验证功能之前砸data-*属性。否则,我无法通过RelaxNG或其他基于语法的模式语言来验证它。

至于预处理XML,一个办法做到这一点与现有的XML工具链将是:

<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> 
:通过滴 data-*属性,但是通过对一切作为,是一个XSLT转换运行

<xsl:template match="@*[starts-with(name(), 'data-')]"/>是那里的重要部分。这会导致任何data-*属性只能放在地板上。该XSL样式表的其余部分仅仅是一个基本的“标识转换”,它从原始XML中按原样传递所有其他信息。

W3C Nu Html Checker(HTML5验证程序)后端对data-*属性的某些功能与XSLT转换功能相同,但是用Java编写。如果你很好奇,它的代码是内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过滤器,在分析时关闭解析事件之前的验证功能工作。

如果你甚至好奇,还有其他预处理过滤器做类似的事情代码:通过把它们放在一个特殊的命名空间

做那些template子树的任何检查无论如何,你得到的总体思路:如果有标记结构中源,你不能表达验证逻辑,任何情况下,对于RelaxNG或XSD,则基本上过滤(预处理)源以从验证函数中隐藏该标记。

相关问题