如何使用HTML5数据属性验证文档?
我需要使用动态属性名称验证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>
预处理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过滤器,在分析时关闭解析事件之前的验证功能工作。
如果你甚至更好奇,还有其他预处理过滤器做类似的事情代码:通过把它们放在一个特殊的命名空间
-
nu.validator.xml.customelements.NamespaceChangingContentHandlerWrapper
-filters出custom elements是the accompanying RelaxNG grammar允许从元素到基本上发生在任何地方 -
nu.validator.xml.templateelement.TemplateElementDroppingContentHandlerWrapper
- 过滤出template
element子树 - 基本上只是将它们放在地板上,因为HTML规范允许template
子树基本上包含任何东西;所以没有必要有验证功能在所有
做那些template
子树的任何检查无论如何,你得到的总体思路:如果有标记结构中源,你不能表达验证逻辑,任何情况下,对于RelaxNG或XSD,则基本上过滤(预处理)源以从验证函数中隐藏该标记。
你可以举一个例子关闭该XML? –
@RaymondNijland是的,当然,我编辑了我的问题。 – Pavel