2013-07-11 48 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>