2011-09-28 42 views
2

我正在使用schematron编写一些针对XML文件的检查。使用schematron获取xml中的重复属性

我想记下一张支票,以便在xml中的任何标记中不得有重复的属性'id'
请注意,属性'id'可以发生在整个xml的任何元素。
我发现了一些与此相关的东西,但是这只适用于使用兄弟姐妹功能的兄弟姐妹。

请建议。

回答

1

这是我使用的方法。对于每个可能具有id属性的元素,在整个文档中执行XPath语句是非常低效的。所以,我使用了一个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属性相匹配的匹配数,并且如果计数不是一个,则会生成一条错误消息。