我正在使用schematron编写一些XML文件检查。
我想写下一张支票,这样xml中的任何标签都不能有重复的属性'id'
。
请注意,属性'id'
可以出现在xml中的任何元素中
我找到了与此相关的东西,但这只是兄弟姐妹的情况,只使用了兄弟姐妹的功能。
请建议。
答案 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
属性计算匹配数,如果计数不是一个,则会产生错误消息。