mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
151 lines
8.7 KiB
XML
151 lines
8.7 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
<!-- ============================================================= -->
|
|
<!--
|
|
This work is in the public domain and may be reproduced, published or
|
|
otherwise used without the permission of the National Library of Medicine (NLM).
|
|
|
|
We request only that the NLM is cited as the source of the work.
|
|
|
|
Although all reasonable efforts have been taken to ensure the accuracy and
|
|
reliability of the software and data, the NLM and the U.S. Government do
|
|
not and cannot warrant the performance or results that may be obtained by
|
|
using this software or data. The NLM and the U.S. Government disclaim all
|
|
warranties, express or implied, including warranties of performance,
|
|
merchantability or fitness for any particular purpose.
|
|
-->
|
|
<!-- ============================================================= -->
|
|
|
|
<schema xmlns="http://purl.oclc.org/dsdl/schematron"
|
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
xmlns:m="http://mulberrytech.com/xslt/oasis-html/util"
|
|
queryBinding="xslt2">
|
|
|
|
<title>OASIS/CALS table validation</title>
|
|
|
|
<!-- Mulberry Technologies (wap)
|
|
|
|
Designed for JATS, but probably also useful in other
|
|
systems using OASIS/CALS/Docbook tables
|
|
|
|
Assumes a table DTD (or schema) valid to the OASIS/CALS/Docbook model
|
|
-->
|
|
|
|
<ns prefix="o" uri="http://docs.oasis-open.org/ns/oasis-exchange/table"/>
|
|
<ns prefix="m" uri="http://mulberrytech.com/xslt/oasis-html/util"/>
|
|
<!--<ns prefix="xsl" uri="http://www.w3.org/1999/XSL/Transform"/>-->
|
|
|
|
<!-- the included stylesheet includes key and function declarations required -->
|
|
<xsl:include href="oasis-exchange-support.xsl"/>
|
|
|
|
<let name="default-border-style" value="solid"/>
|
|
|
|
<pattern>
|
|
<rule context="o:tgroup">
|
|
<let name="okay-cols" value="@cols[. castable as xs:integer][. > 0]"/>
|
|
<assert test="exists(@cols)">tgroup/@cols is not given</assert>
|
|
<assert test="empty(@cols) or exists($okay-cols)">@cols should be a natural number
|
|
(integer greater than zero).</assert>
|
|
<assert test="empty($okay-cols) or empty(o:colspec) or (count(o:colspec) = @cols)">The tgroup has
|
|
<value-of select="count(o:colspec)"/> colspec<value-of select="if (count(o:colspec) = 1) then '' else 's'"/>,
|
|
but its @cols is given as '<value-of select="@cols"/>'.</assert>
|
|
<report test="not(*/o:row/m:actual-cols(.) != */o:row/m:actual-cols(.))
|
|
and ($okay-cols != m:actual-cols((*/o:row)[1]))">tgroup/@cols is given as
|
|
<value-of select="$okay-cols"/>, but all rows have <value-of
|
|
select="m:actual-cols((*/o:row)[1])"/> entr<value-of
|
|
select="if (m:actual-cols((*/o:row)[1]) eq 1) then 'y' else 'ies'"/>.
|
|
</report>
|
|
<report test="@align='char'" role="warning">Without assigning @char or @charoff to everything,
|
|
assigning @align='char' to tgroup only aligns contents to right of center.</report>
|
|
</rule>
|
|
|
|
<rule context="o:colspec">
|
|
<let name="okay-colwidth"
|
|
value="@colwidth[exists(m:colwidth-unit(current()))]"/>
|
|
<assert test="empty(@colwidth) or exists($okay-colwidth)">Malformed @colwidth.</assert>
|
|
<assert test="empty($okay-colwidth) or
|
|
(count(../o:colspec[m:colwidth-unit(.)=m:colwidth-unit(current())]) >
|
|
count(../o:colspec[not(m:colwidth-unit(.)=m:colwidth-unit(current()))]))">@colwidth unit
|
|
(<value-of select="m:colwidth-unit(.)"/>) is not consistent with the
|
|
units on other colspecs.</assert>
|
|
|
|
<assert test="empty($okay-colwidth) or matches($okay-colwidth,'^\s*\*\s*$')
|
|
or (xs:double(replace($okay-colwidth,'[\s\p{L}\*]','')[. castable as xs:double]) > 0)">@colwidth must be positive</assert>
|
|
<report test="empty(m:colwidth-unit(.))
|
|
and exists(../o:colspec/m:colwidth-unit(.))">The same unit of measure should be used on every
|
|
colspec/@colwidth.</report>
|
|
|
|
<assert test="empty(@colnum) or (@colnum = count(.|preceding-sibling::o:colspec))">@colnum
|
|
'<value-of select="@colnum"/>' does not correspond to
|
|
the column's actual number (<value-of select="count(.|preceding-sibling::o:colspec)"/>)</assert>
|
|
<report test="@colname = (../o:colspec except .)/@colname">The same @colname is assigned to more than
|
|
one colspec.</report>
|
|
<assert test="not(@align='char') or exists(@char)" role="warning">@align='char', but no @char is given.</assert>
|
|
<report test="normalize-space(@char) and not((@align,../@align)[1]='char')">@char is given, but alignment is not 'char'.</report>
|
|
<assert test="empty(@charoff) or ((@align,../@align)[1]='char')" role="warning">@charoff is given, but alignment is not 'char'.</assert>
|
|
</rule>
|
|
|
|
<rule context="o:row">
|
|
<let name="tgroup" value="ancestor::o:tgroup[1]"/>
|
|
<let name="rowno" value="m:rowno(.)"/>
|
|
<let name="given-entries" value="count(distinct-values(key('entry-by-row',$rowno,$tgroup)/m:across(.)))"/>
|
|
<report test="$given-entries < $tgroup/@cols
|
|
and exists($tgroup/@cols[. castable as xs:integer])" role="warning">
|
|
The row doesn't have enough entries (<value-of select="$tgroup/@cols"/>
|
|
<value-of select="if ($tgroup/@cols=1) then ' is' else ' are'"/> expected;
|
|
<value-of select="$given-entries"/> <value-of select="if ($given-entries=1) then ' is' else ' are'"/> given).
|
|
</report>
|
|
</rule>
|
|
<rule context="o:entry">
|
|
<let name="tgroup" value="ancestor::o:tgroup[1]"/>
|
|
<assert test="empty(@nameend) or exists(key('colspec-by-name',@nameend,$tgroup))">No colspec is
|
|
named <value-of select="@nameend"/>.</assert>
|
|
<assert test="empty(@nameend|@namest) or
|
|
(key('colspec-by-name',@nameend,$tgroup) >> key('colspec-by-name',@namest,$tgroup))">Entry's end
|
|
column (<value-of select="@nameend"/>) must follow its start column
|
|
(<value-of select="@namest"/>).</assert>
|
|
<assert test="empty(@namest) or exists(key('colspec-by-name',@namest,$tgroup))">No colspec is
|
|
named <value-of select="@namest"/>.</assert>
|
|
<assert test="empty(@colname) or exists(key('colspec-by-name',@colname,$tgroup))">No colspec is
|
|
named <value-of select="@colname"/>.</assert>
|
|
<assert test="empty(@nameend) or exists(@colname|@namest)">Entry is assigned an end
|
|
column (<value-of select="@nameend"/>) but not a start column.</assert>
|
|
<assert test="not(@colname != @namest)">Entry is assigned to column <value-of select="@colname"/>,
|
|
so it can't start at column <value-of select="@namest"/>.
|
|
</assert>
|
|
|
|
<assert test="m:across(.)[1] > (preceding-sibling::o:entry[1]/m:across(.)[last()],0)[1]">
|
|
Entry must be assigned to a free column (after its preceding entries).
|
|
</assert>
|
|
|
|
<report test="m:down(.) > m:rowno(../../o:row[last()])">This entry doesn't fit into
|
|
its <value-of select="local-name(../..)"/>.</report>
|
|
|
|
<report test="(exists(@morerows) and
|
|
(key('entry-by-row',m:down(.),$tgroup)/m:across(.)[last()] > $tgroup/@cols))
|
|
or empty($tgroup/@cols)" role="warning">
|
|
A row in which this entry appears has too many entries.
|
|
</report>
|
|
<!-- the next rule will never fire for entries spanning columns: they always
|
|
fit by virtue of being assigned a @nameend -->
|
|
<report test="(m:across(.)[last()] > $tgroup/@cols) or empty($tgroup/@cols)">
|
|
Entry does not fit in row. (<value-of select="$tgroup/@cols"/> are allowed; entry
|
|
is in column <value-of select="m:across(.)[last()]"/>.)
|
|
<!-- Entry does not fit in row. (# columns are allowed; row ends in column #.) -->
|
|
</report>
|
|
|
|
<assert test="empty(@char) or m:align(.)='char'" role="warning">@char is given, but alignment is not 'char'.</assert>
|
|
<assert test="empty(@charoff) or m:align(.)='char'" role="warning">@charoff is given, but alignment is not 'char'.</assert>
|
|
<assert test="empty(@charoff) or ((@charoff castable as xs:integer) and
|
|
(@charoff >= 0) and (@charoff <= 100))">@charoff must be a whole number between 0 and 100.</assert>
|
|
<assert test="not(m:align(.)='char') or exists(@char|m:colspec-for-entry(.)/@char)" role="warning">
|
|
Entry is designated for character alignment, but no character (@char) is given on it or its colspec.
|
|
</assert>
|
|
<assert test="empty(@char) or not(@char != m:colspec-for-entry(.)/@char)">
|
|
Entry is assigned an alignment character (<value-of select="@char"/>)
|
|
different from its column's (<value-of select="m:colspec-for-entry(.)/@char"/>).</assert>
|
|
<report test="exists(*) and (m:align(.)='char')" role="warning">With @align='char', markup of
|
|
entry contents (<value-of select="string-join(distinct-values(*/name()),', ')"/>) will be ignored.</report>
|
|
</rule>
|
|
</pattern>
|
|
</schema> |