2
我正在使用schematron编写一些针对XML文件的检查。使用schematron获取xml中的重复属性
我想记下一张支票,以便在xml中的任何标记中不得有重复的属性'id'
。
请注意,属性'id'
可以发生在整个xml的任何元素。
我发现了一些与此相关的东西,但是这只适用于使用兄弟姐妹功能的兄弟姐妹。
请建议。
我正在使用schematron编写一些针对XML文件的检查。使用schematron获取xml中的重复属性
我想记下一张支票,以便在xml中的任何标记中不得有重复的属性'id'
。
请注意,属性'id'
可以发生在整个xml的任何元素。
我发现了一些与此相关的东西,但是这只适用于使用兄弟姐妹功能的兄弟姐妹。
请建议。
这是我使用的方法。对于每个可能具有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
属性相匹配的匹配数,并且如果计数不是一个,则会生成一条错误消息。