我正在使用 schematron 为 XML 文件编写一些检查。
我想写下一个检查,以便'id'
在 xml 中的任何标记中都不能有重复的属性。
请注意,属性'id'
可以出现在 xml 中的任何元素中。
我发现了一些与此相关的东西,但仅适用于使用前兄弟功能的兄弟姐妹。
请建议。
我正在使用 schematron 为 XML 文件编写一些检查。
我想写下一个检查,以便'id'
在 xml 中的任何标记中都不能有重复的属性。
请注意,属性'id'
可以出现在 xml 中的任何元素中。
我发现了一些与此相关的东西,但仅适用于使用前兄弟功能的兄弟姐妹。
请建议。
这是我使用的方法。对可能具有 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,则生成错误消息。