2013-07-11 72 views
3

我是新的schematron,我有以下問題。這是從XHTML文件的片段:實施schematron規則

<div class="provision"> 
    <!-- provision (SECTION) --> 
    <header> 
    <!-- headers --> 
    <div class="desig"> 
     <!-- if provision then header/[email protected]=desig/[email protected]=num required --> 
     <span class="num">1.</span> 
    </div> 
    <h1 class="title">prov-title</h1> 
    </header> 
    <p class="prov">para-prov-level</p> 
    <p class="prov">para-prov-level</p> 
    <div class="glossary"> 
    <!-- glossary --> 
    <!-- glossary requires dl --> 
    <dl> 
     <!-- dl should have dt, and at least one dd --> 
     <dt> term </dt> 
     <dd>definition</dd> 
     <dt> term </dt> 
     <dd>definition</dd> 
    </dl> 
    </div> 
    <div class="level-1-grp"> 
    <!-- SUBSECTION --> 
    <header> 
     <div class="desig"> 
     <span class="num">(1)</span> 
     </div> 
    </header> 
    <p class="level-1">para-level-1</p> 
    <div class="level-2-grp"> 
     <header> 
     <div class="desig"> 
      <span class="num">(a)</span> 
     </div> 
     </header> 
     <p class="level-2">para-level-2</p> 
    </div> 
    <div class="level-2-grp"> 
     <header> 
     <div class="desig"> 
      <span class="num">(b)</span> 
     </div> 
     </header> 
     <p class="level-2">para-level-2</p> 
    </div> 
    <p class="level-1">para-level-1</p> 
    </div> 
    <p class="prov">para-prov-level</p> 
</div> 

,我想創建一個規則,以檢查 是否有provision然後header/[email protected]=desig/[email protected]=num需要和glossary需要dl。我一直在嘗試這樣的,但它不工作:

<iso:pattern id="structure-provision"> 
    <iso:title>Testing for Provision structure...</iso:title> 
    <iso:rule context="*:div[@class='provision']"> 
    <iso:assert test="self::*:header/div[@class ='desig']/*:span[@class='num']">if provision then header/[email protected]=desig/[email protected]=num required</iso:assert> 
    </iso:rule> 
</iso:pattern> 

<!--glossory structure --> 

<iso:pattern id="structure-glossory"> 
    <iso:title>Testing for Provision structure...</iso:title> 
    <iso:rule context="*:div[@class='glossory']"> 
    <iso:assert test="self::*:dl">glossary requires dl</iso:assert> 
    <iso:assert test="self::*:dl/dt">dl should have a dt</iso:assert> 
    </iso:rule> 

</iso:pattern> 

任何幫助,將不勝感激。謝謝

+0

哪位不工作?所有的?鑑於你的上下文節點是正確的,測試節點應該是相對的。在做schematron時,我總是從簡單開始。因此,例如,我強迫斷言來證明上下文,並更改我正在驗證的文檔以減少潛在的歧義。除非你有一些非常聰明的工具,否則調試很痛苦。 –

+0

如果我的回答解決了您的問題,您能否將其標記爲正確答案?謝謝 – conorgil

回答

3

您在第一個iso:assert中的div元素上缺少名稱空間。

英語不是很精確,所以我用兩種方式解釋你的要求。 (header/div @ class = desig/span @ class = num required AND詞彙表需要dl)。 「如果X,那麼A和B」。如果是這種情況,那麼應該只使用一種模式。

<?xml version="1.0" encoding="UTF-8"?> 
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"> 
    <sch:pattern id="structure-provision"> 
     <sch:title>Provisioning structure</sch:title> 
     <sch:rule context="*:div[@class='provision']"> 
      <sch:assert test="*:header/*:div[@class ='desig']/*:span[@class='num']"> 
       The provision structure requires header/[email protected]=desig/[email protected]=num 
      </sch:assert> 
      <sch:assert test="*:div[@class='glossary']/*:dl"> 
       Glossary requires dl 
      </sch:assert> 
     </sch:rule> 
    </sch:pattern> 
</sch:schema> 

2)(如果存在的規定然後報頭/格@類= DESIG /跨度@類= NUM​​需要)AND(詞彙表需要DL)。 「如果X,那麼A.另外,如果Y,那麼B」。如果是這種情況,那麼應該使用兩種模式。

<?xml version="1.0" encoding="UTF-8"?> 
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"> 
    <sch:pattern id="provision-structure"> 
     <sch:title>Provisioning structure</sch:title> 
     <sch:rule context="*:div[@class='provision']"> 
      <sch:assert test="*:header/*:div[@class ='desig']/*:span[@class='num']"> 
       The provision structure requires header/[email protected]=desig/[email protected]=num 
      </sch:assert> 
     </sch:rule> 
    </sch:pattern> 

    <sch:pattern id="glossary-structure"> 
     <sch:title>Provisioning structure</sch:title> 
     <sch:rule context="*:div[@class='glossary']"> 
      <sch:assert test="*:dl"> 
       Glossary requires dl 
      </sch:assert> 
      <sch:assert test="*:dl/*:dt"> 
       dl requires dt 
      </sch:assert> 
     </sch:rule> 
    </sch:pattern> 
</sch:schema> 

我會建議將您的需求分成幾個規則/模式,以使事情更健全和有組織。例如,讓您的所有規則都與單一模式內的配置結構相關。如果詞彙表規則應該被強制執行,而不管詞彙表是否在供應結構內,詞彙表應該有它自己的模式。

此外,我會定義和使用元素的名稱空間,並在schematron規則中使用它。我認爲它是xh​​tml或類似的? xpath表達式會變成類似於:

<sch:rule context="xhtml:div[@class='provision']"> 
    <sch:assert test="xhtml:header/xhtml:div[@class ='desig']/xhtml:span[@class='num']"> 
     Rule text here 
    </sch:assert> 
</sch:rule>