Мне нужно проверить XML с динамическими именами атрибутов, как data-*
, Сейчас я использую схему RelaxNG, но она не поддерживает динамические имена атрибутов. Какие есть варианты? Я не могу найти ничего актуального ..
Пример 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>
Предварительно обработайте XML для удаления data-*
атрибуты, прежде чем передать его в функцию проверки. В противном случае я не знаю, как это проверить с помощью RelaxNG или других языков схем, основанных на грамматике.
Что касается предварительной обработки XML, одним из способов сделать это с существующей цепочкой инструментов XML будет: запустить его с помощью преобразования XSLT, которое отбрасывает data-*
атрибуты, но передает все остальное как есть:
<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) сервер делает что-то для data-*
атрибуты, которые функционально аналогичны XSLT-преобразованию, но написаны на Java. Если вам интересно, код для этого в репозиторий GitHub для источников W3C Nu Html Checker, Вот:
https://github.com/validator/validator/tree/master/src/nu/validator/xml/dataattributes
Увидеть filterAttributes
код в DataAttributeDroppingContentHandlerWrapper.java
По сути, это фильтр SAX, который работает во время синтаксического анализа вне событий анализа перед функцией проверки.
И если вы даже Больше Любопытно, что есть код для других фильтров предварительной обработки, делающих подобные вещи:
nu.validator.xml.customelements.NamespaceChangingContentHandlerWrapper
— отфильтровывает пользовательские элементы помещая их в специальное пространство имен, сопутствующая грамматика RelaxNG позволяет элементам происходить практически вездеnu.validator.xml.templateelement.TemplateElementDroppingContentHandlerWrapper
— отфильтровывает template
элемент поддеревья — по сути, просто бросив их на пол, потому что спецификация HTML позволяет template
поддеревья содержат в основном все; так что нет необходимости иметь функцию проверки, чтобы делать какие-либо проверки на тех, template
поддеревья вообщеВ любом случае, вы получите общее представление: если в вашем источнике есть какие-либо конструкции разметки, для которых вы не можете выразить логику проверки в RelaxNG или XSD, то вы по существу фильтруете (препроцессируете) источник, чтобы скрыть эту разметку от функции проверки ,
Других решений пока нет …