OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

docbook-apps message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Schematron.


I took the version 5 schematron file as a basis
and updated to iso Schematron.

I'd fallen foul of using xml:id values and other html files with the 
same name (OK OK I know it was stupid :-)

So i added a couple of tests.

Also added a check for duplicate xml:id values (nxml-mode doesn't show 
that).

Below is the iso schematron file.

See www.schematron.com for appropriate files.

HTH DaveP





<?xml version="1.0" encoding="utf-8"?>
<iso:schema xmlns:iso="http://purl.oclc.org/dsdl/schematron";
	    xmlns:xlink="http://www.w3.org/1999/xlink";
	    queryBinding="xslt2"
	    xmlns="http://purl.oclc.org/dsdl/schematron";>
    <iso:ns prefix="db" uri="http://docbook.org/ns/docbook"/>
    <iso:ns prefix='xlink' uri="http://www.w3.org/1999/xlink"/>
    <iso:pattern >
       <iso:title >Glossary 'firstterm' type constraint</iso:title>
       <iso:rule context="db:firstterm[@linkend]">
          <iso:assert test="local-name(//*[@id=current()/@linkend]) = 
'glossentry' and namespace-uri(//*[@id=current()/@linkend]) = 
'http://docbook.org/ns/docbook'">@linkend on firstterm must point to a 
glossentry.</iso:assert>
       </iso:rule>
    </iso:pattern>
    <iso:pattern >
       <iso:title >Footnote reference type constraint</iso:title>
       <iso:rule context="db:footnoteref">
          <iso:assert test="local-name(//*[@id=current()/@linkend]) = 
'footnote' and namespace-uri(//*[@id=current()/@linkend]) = 
'http://docbook.org/ns/docbook'">@linkend on footnoteref must point to a 
footnote.</iso:assert>
       </iso:rule>
    </iso:pattern>
    <iso:pattern >
       <iso:title >Glossary 'glossterm' type constraint</iso:title>
       <iso:rule context="db:glossterm[@linkend]">
          <iso:assert test="local-name(//*[@id=current()/@linkend]) = 
'glossentry' and namespace-uri(//*[@id=current()/@linkend]) = 
'http://docbook.org/ns/docbook'">@linkend on glossterm must point to a 
glossentry.</iso:assert>
       </iso:rule>
    </iso:pattern>
    <iso:pattern >
       <iso:title >Synopsis fragment type constraint</iso:title>
       <iso:rule context="db:synopfragmentref">
          <iso:assert test="local-name(//*[@id=current()/@linkend]) = 
'synopfragment' and namespace-uri(//*[@id=current()/@linkend]) = 
'http://docbook.org/ns/docbook'">@linkend on synopfragmentref must point 
to a synopfragment.</iso:assert>
       </iso:rule>
    </iso:pattern>
    <iso:pattern >
       <iso:title >Glossary 'seealso' type constraint</iso:title>
       <iso:rule context="db:glossseealso[@otherterm]">
          <iso:assert test="local-name(//*[@id=current()/@otherterm]) = 
'glossentry' and namespace-uri(//*[@id=current()/@otherterm]) = 
'http://docbook.org/ns/docbook'">@otherterm on glossseealso must point 
to a glossentry.</iso:assert>
       </iso:rule>
    </iso:pattern>
    <iso:pattern >
       <iso:title >Glosssary 'see' type constraint</iso:title>
       <iso:rule context="db:glosssee[@otherterm]">
          <iso:assert test="local-name(//*[@id=current()/@otherterm]) = 
'glossentry' and namespace-uri(//*[@id=current()/@otherterm]) = 
'http://docbook.org/ns/docbook'">@otherterm on glosssee must point to a 
glossentry.</iso:assert>
       </iso:rule>
    </iso:pattern>
    <iso:pattern >
       <iso:title >Glossary term definition constraint</iso:title>
       <iso:rule context="db:termdef">
          <iso:assert test="count(db:glossterm) = 1">A termdef must 
contain exactly one glossterm</iso:assert>
       </iso:rule>
    </iso:pattern>
    <iso:pattern >
       <iso:title >Element exclusion</iso:title>
       <iso:rule context="db:annotation">
          <iso:assert test="not(.//db:annotation)">annotation must not 
occur in the descendants of annotation</iso:assert>
       </iso:rule>
       <iso:rule context="db:caution">
          <iso:assert test="not(.//db:caution)">caution must not occur 
in the descendants of caution</iso:assert>
          <iso:assert test="not(.//db:important)">important must not 
occur in the descendants of caution</iso:assert>
          <iso:assert test="not(.//db:note)">note must not occur in the 
descendants of caution</iso:assert>
          <iso:assert test="not(.//db:tip)">tip must not occur in the 
descendants of caution</iso:assert>
          <iso:assert test="not(.//db:warning)">warning must not occur 
in the descendants of caution</iso:assert>
       </iso:rule>
       <iso:rule context="db:important">
          <iso:assert test="not(.//db:caution)">caution must not occur 
in the descendants of important</iso:assert>
          <iso:assert test="not(.//db:important)">important must not 
occur in the descendants of important</iso:assert>
          <iso:assert test="not(.//db:note)">note must not occur in the 
descendants of important</iso:assert>
          <iso:assert test="not(.//db:tip)">tip must not occur in the 
descendants of important</iso:assert>
          <iso:assert test="not(.//db:warning)">warning must not occur 
in the descendants of important</iso:assert>
       </iso:rule>
       <iso:rule context="db:note">
          <iso:assert test="not(.//db:caution)">caution must not occur 
in the descendants of note</iso:assert>
          <iso:assert test="not(.//db:important)">important must not 
occur in the descendants of note</iso:assert>
          <iso:assert test="not(.//db:note)">note must not occur in the 
descendants of note</iso:assert>
          <iso:assert test="not(.//db:tip)">tip must not occur in the 
descendants of note</iso:assert>
          <iso:assert test="not(.//db:warning)">warning must not occur 
in the descendants of note</iso:assert>
       </iso:rule>
       <iso:rule context="db:tip">
          <iso:assert test="not(.//db:caution)">caution must not occur 
in the descendants of tip</iso:assert>
          <iso:assert test="not(.//db:important)">important must not 
occur in the descendants of tip</iso:assert>
          <iso:assert test="not(.//db:note)">note must not occur in the 
descendants of tip</iso:assert>
          <iso:assert test="not(.//db:tip)">tip must not occur in the 
descendants of tip</iso:assert>
          <iso:assert test="not(.//db:warning)">warning must not occur 
in the descendants of tip</iso:assert>
       </iso:rule>
       <iso:rule context="db:warning">
          <iso:assert test="not(.//db:caution)">caution must not occur 
in the descendants of warning</iso:assert>
          <iso:assert test="not(.//db:important)">important must not 
occur in the descendants of warning</iso:assert>
          <iso:assert test="not(.//db:note)">note must not occur in the 
descendants of warning</iso:assert>
          <iso:assert test="not(.//db:tip)">tip must not occur in the 
descendants of warning</iso:assert>
          <iso:assert test="not(.//db:warning)">warning must not occur 
in the descendants of warning</iso:assert>
       </iso:rule>
       <iso:rule context="db:caption">
          <iso:assert test="not(.//db:caution)">caution must not occur 
in the descendants of caption</iso:assert>
          <iso:assert test="not(.//db:example)">example must not occur 
in the descendants of caption</iso:assert>
          <iso:assert test="not(.//db:figure)">figure must not occur in 
the descendants of caption</iso:assert>
          <iso:assert test="not(.//db:important)">important must not 
occur in the descendants of caption</iso:assert>
          <iso:assert test="not(.//db:note)">note must not occur in the 
descendants of caption</iso:assert>
          <iso:assert test="not(.//db:sidebar)">sidebar must not occur 
in the descendants of caption</iso:assert>
          <iso:assert test="not(.//db:table)">table must not occur in 
the descendants of caption</iso:assert>
          <iso:assert test="not(.//db:task)">task must not occur in the 
descendants of caption</iso:assert>
          <iso:assert test="not(.//db:tip)">tip must not occur in the 
descendants of caption</iso:assert>
          <iso:assert test="not(.//db:warning)">warning must not occur 
in the descendants of caption</iso:assert>
       </iso:rule>
       <iso:rule context="db:example">
          <iso:assert test="not(.//db:caution)">caution must not occur 
in the descendants of example</iso:assert>
          <iso:assert test="not(.//db:example)">example must not occur 
in the descendants of example</iso:assert>
          <iso:assert test="not(.//db:figure)">figure must not occur in 
the descendants of example</iso:assert>
          <iso:assert test="not(.//db:important)">important must not 
occur in the descendants of example</iso:assert>
          <iso:assert test="not(.//db:note)">note must not occur in the 
descendants of example</iso:assert>
          <iso:assert test="not(.//db:table)">table must not occur in 
the descendants of example</iso:assert>
          <iso:assert test="not(.//db:tip)">tip must not occur in the 
descendants of example</iso:assert>
          <iso:assert test="not(.//db:warning)">warning must not occur 
in the descendants of example</iso:assert>
       </iso:rule>
       <iso:rule context="db:figure">
          <iso:assert test="not(.//db:caution)">caution must not occur 
in the descendants of figure</iso:assert>
          <iso:assert test="not(.//db:example)">example must not occur 
in the descendants of figure</iso:assert>
          <iso:assert test="not(.//db:figure)">figure must not occur in 
the descendants of figure</iso:assert>
          <iso:assert test="not(.//db:important)">important must not 
occur in the descendants of figure</iso:assert>
          <iso:assert test="not(.//db:note)">note must not occur in the 
descendants of figure</iso:assert>
          <iso:assert test="not(.//db:table)">table must not occur in 
the descendants of figure</iso:assert>
          <iso:assert test="not(.//db:tip)">tip must not occur in the 
descendants of figure</iso:assert>
          <iso:assert test="not(.//db:warning)">warning must not occur 
in the descendants of figure</iso:assert>
       </iso:rule>
       <iso:rule context="db:table">
          <iso:assert test="not(.//db:caution)">caution must not occur 
in the descendants of table</iso:assert>
          <iso:assert test="not(.//db:example)">example must not occur 
in the descendants of table</iso:assert>
          <iso:assert test="not(.//db:figure)">figure must not occur in 
the descendants of table</iso:assert>
          <iso:assert test="not(.//db:important)">important must not 
occur in the descendants of table</iso:assert>
          <iso:assert test="not(.//db:informaltable)">informaltable must 
not occur in the descendants of table</iso:assert>
          <iso:assert test="not(.//db:note)">note must not occur in the 
descendants of table</iso:assert>
          <iso:assert test="not(.//db:tip)">tip must not occur in the 
descendants of table</iso:assert>
          <iso:assert test="not(.//db:warning)">warning must not occur 
in the descendants of table</iso:assert>
       </iso:rule>
       <iso:rule context="db:footnote">
          <iso:assert test="not(.//db:caution)">caution must not occur 
in the descendants of footnote</iso:assert>
          <iso:assert test="not(.//db:epigraph)">epigraph must not occur 
in the descendants of footnote</iso:assert>
          <iso:assert test="not(.//db:example)">example must not occur 
in the descendants of footnote</iso:assert>
          <iso:assert test="not(.//db:figure)">figure must not occur in 
the descendants of footnote</iso:assert>
          <iso:assert test="not(.//db:footnote)">footnote must not occur 
in the descendants of footnote</iso:assert>
          <iso:assert test="not(.//db:important)">important must not 
occur in the descendants of footnote</iso:assert>
          <iso:assert test="not(.//db:indexterm)">indexterm must not 
occur in the descendants of footnote</iso:assert>
          <iso:assert test="not(.//db:note)">note must not occur in the 
descendants of footnote</iso:assert>
          <iso:assert test="not(.//db:sidebar)">sidebar must not occur 
in the descendants of footnote</iso:assert>
          <iso:assert test="not(.//db:table)">table must not occur in 
the descendants of footnote</iso:assert>
          <iso:assert test="not(.//db:task)">task must not occur in the 
descendants of footnote</iso:assert>
          <iso:assert test="not(.//db:tip)">tip must not occur in the 
descendants of footnote</iso:assert>
          <iso:assert test="not(.//db:warning)">warning must not occur 
in the descendants of footnote</iso:assert>
       </iso:rule>
       <iso:rule context="db:sidebar">
          <iso:assert test="not(.//db:sidebar)">sidebar must not occur 
in the descendants of sidebar</iso:assert>
       </iso:rule>
    </iso:pattern>
    <iso:pattern >
       <iso:title >Cardinality of segments and titles</iso:title>
       <iso:rule context="db:seglistitem">
          <iso:assert test="count(db:seg) = count(../db:segtitle)">The 
number of seg elements must be the same as the number of segtitle 
elements in the parent segmentedlist</iso:assert>
       </iso:rule>
    </iso:pattern>
    <iso:pattern >
       <iso:title >Root must have version</iso:title>
       <iso:rule context="/db:para">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:set">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:book">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:dedication">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:colophon">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:appendix">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:chapter">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:part">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:preface">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:section">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:article">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:sect1">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:sect2">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:sect3">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:sect4">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:sect5">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:reference">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:refentry">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:refsection">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:refsect1">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:refsect2">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:refsect3">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:glossary">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:bibliography">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:index">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:setindex">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
       <iso:rule context="/db:toc">
          <iso:assert test="@version">The root element must have a 
version attribute.</iso:assert>
       </iso:rule>
    </iso:pattern>


  <iso:pattern id="idChecks">
      <iso:title>Check for duplicate id values</iso:title>
      <iso:rule context="*[@xml:id]">
        <iso:report test="@xml:id=following::*/@xml:id">Duplicate id 
values found. Value is <iso:value-of select="@xml:id"/></iso:report>
      </iso:rule>
  </iso:pattern>

    <iso:pattern id="chunkChecks">
      <iso:title>Check for duplicate filenames</iso:title>
      <iso:rule context="db:chapter">
        <iso:report test="following::db:chapter/@xml:id = 
current()/@xml:id">Warning: Two chapters with same id value.
      If chunking this will cause overwritten html
        </iso:report>
      </iso:rule>

      <iso:rule context="db:chapter[@xml:id]">
       <iso:report test="concat(@xml:id,'.html') =
        descendant::db:link/@xlink:href">Warning:
        Chapter has duplicate xml:id value to a linked html file. If
        chunking and using id values as filenames this will cause an
        overwritten html file [<iso:value-of
        select="@xml:id"/>.html]</iso:report>
      </iso:rule>

      <iso:rule context="db:appendix[@xml:id]">
        <iso:report test="concat(@xml:id,'.html') =
        descendant::db:link/@xlink:href">Warning:
        Appendix has duplicate xml:id value to a linked html file. If
        chunking and using id values as filenames this will cause an
        overwritten html file [<iso:value-of
        select="@xml:id"/>.html]</iso:report>
      </iso:rule>

    </iso:pattern>
</iso:schema>

regards

-- 
Dave Pawson
XSLT XSL-FO FAQ.
http://www.dpawson.co.uk


[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]