Это подход, который я использую.Совершенно неэффективно выполнять оператор 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
и выдает сообщение об ошибке, если счет не один.