使用schematron在xml中获取重复的属性

时间:2011-09-28 10:18:52

标签: duplicates schematron

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

我想写下一张支票,这样xml中的任何标签都不能有重复的属性'id'
请注意,属性'id'可以出现在xml中的任何元素中 我找到了与此相关的东西,但这只是兄弟姐妹的情况,只使用了兄弟姐妹的功能。

请建议。

1 个答案:

答案 0 :(得分: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属性计算匹配数,如果计数不是一个,则会产生错误消息。