Получить дубликаты атрибутов в XML с помощью schematron - PullRequest
2 голосов
/ 28 сентября 2011

Я пишу несколько проверок для XML-файла с помощью schematron.

Я хочу записать проверку, чтобы в любом теге в xml не было дублирующегося атрибута 'id'.
Обратите внимание, атрибут 'id' может встречаться в любом элементе xml.
Я нашел что-то связанное с этим, но это касается только братьев и сестер, которые использовали функцию предшествующего брата.

Пожалуйста, предложите.

1 Ответ

1 голос
/ 29 сентября 2011

Это подход, который я использую.Совершенно неэффективно выполнять оператор XPath по всему документу для каждого элемента, который может иметь атрибут id.Итак, я использую xsl: ключ.В приведенном ниже решении используется ISO Schematron.

<schema xmlns="http://purl.oclc.org/dsdl/schematron"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    queryBinding="xslt2" schemaVersion="ISO19757-3">

    <xsl:key name="xmlid" match="*[@id]" use="@id"/>

    <pattern id="duplicate_id"> 
        <rule context="*[@id]"> 
           <assert test="count(key('xmlid', @id)) = 1">
           Duplicated id in element "<name/>" - "<value-of select='@id'/>".
           </assert>
        </rule> 
    </pattern> 
</schema>

Ключ кэширует все элементы, имеющие атрибут id.Правило затем применяется ко всем элементам с этим атрибутом.Утверждение просто подсчитывает количество совпадений с атрибутом id и выдает сообщение об ошибке, если счет не один.

...