2011-09-28 43 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屬性相匹配的匹配數,並且如果計數不是一個,則會生成一條錯誤消息。