2

我正在使用 schematron 为 XML 文件编写一些检查。

我想写下一个检查,以便'id'在 xml 中的任何标记中都不能有重复的属性。
请注意,属性'id'可以出现在 xml 中的任何元素中。
我发现了一些与此相关的东西,但仅适用于使用前兄弟功能的兄弟姐妹。

请建议。

4

1 回答 1

1

这是我使用的方法。对可能具有 id 属性的每个元素在整个文档中执行 XPath 语句的效率非常低。所以,我使用 xsl:key。以下解决方案使用 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如果计数不为 1,则生成错误消息。

于 2011-09-29T06:16:34.717 回答