--- /dev/null
+
+./check ./test-policy.conf
+
+for i in /etc/dbus-1/system.d/*.conf; do ./check "$i" | wc -l ; done
--- /dev/null
+#!/bin/bash
+
+xslt_processor="xsltproc --nonet --novalid --maxdepth 20000"
+tmpdir="./tmp/"
+
+function exit_with_code() {
+ rm -rf $tmpdir
+ exit $1
+}
+
+
+if [ "$#" -ne 1 ]; then
+ echo "Usage: $0 config-file"
+ exit 1
+fi
+
+config_file=$1
+schema_file="./rules.xsl"
+
+if [ ! -f $config_file ]; then
+ echo "config file does not exist"
+ exit 1
+fi
+
+if [ -d "$tmpdir" ]; then
+ rm -rf "$tmpdir"
+fi
+
+rm -rf error*.log
+mkdir $tmpdir
+
+
+# TEST 1/3: check cynara privileges existence (there are too many to perform this check using xsltproc)
+system_privileges_file="$tmpdir/privileges_system"
+conf_privileges_file="$tmpdir/privileges_conf"
+grep "http://tizen.org/privilege" /var/cynara/db/* | sed "s/;[^;]*;$//g" | sed "s/.*http/http/g" | uniq > $system_privileges_file
+$xslt_processor ./extract_privilege.xsl $config_file | uniq > $conf_privileges_file
+grep -Fxv -f $system_privileges_file $conf_privileges_file | while read line ; do echo "FAILED(cynara) no privilege in cynara db: $line" ; done
+
+# TEST 2/3: check allow/deny duplicates (impossible to do directly with xpath 1.0, I don't know how to embed it into schematron config)
+$xslt_processor ./same.xsl $config_file
+
+
+# TEST 3/3: apply schematron rules
+
+# build a test (@user = x or @user = y or ...) at runtime
+users_test=$(cat /etc/passwd | sed "s/:.*//g" | sort | paste -sd "," | sed "s/,/' or @user = '/g" | sed "s/^/@user = '/" | sed "s/$/'/")
+groups_test=$(cat /etc/group | sed "s/:.*//g" | sort | paste -sd "," | sed "s/,/' or @group = '/g" | sed "s/^/@group = '/" | sed "s/$/'/")
+
+tmpname="$tmpdir$(basename $schema_file)"
+
+cat $schema_file | sed "s/USERS_TEST/$users_test/g" | sed "s/GROUPS_TEST/$groups_test/g" > $tmpname.0 2> error.0.log
+if [ $? != 0 ]; then
+ echo "XSL Phase 0 failed, error log saved to error.0.log"
+ exit_with_code 1
+fi
+
+$xslt_processor xslt/iso_dsdl_include.xsl $tmpname.0 > $tmpname.1 2> error.1.log
+if [ $? != 0 ]; then
+ echo "XSL Phase 1 failed, error log saved to error.1.log"
+ exit_with_code 1
+fi
+
+$xslt_processor xslt/iso_abstract_expand.xsl $tmpname.1 > $tmpname.2 2> error.2.log
+if [ ! $? == 0 ]; then
+ echo "XSL Phase 2 failed, error log saved to error.2.log"
+ exit 1
+fi
+
+$xslt_processor xslt/iso_svrl_for_xslt1.xsl $tmpname.2 > $tmpname.3 2> error.3.log
+if [ $? != 0 ]; then
+ echo "XSL Phase 3 failed, error log saved to error.3.log"
+ exit_with_code 1
+fi
+
+$xslt_processor $tmpname.3 $config_file > $tmpname.4 2> error.4.log
+if [ $? != 0 ]; then
+ echo "Schematron test failed, error log saved to error.4.log"
+ exit_with_code 1
+fi
+
+$xslt_processor report.xsl $tmpname.4 2> error.5.log
+if [ $? != 0 ]; then
+ echo "Formatting test results failed, error log saved to error.5.log"
+ exit_with_code 1
+fi
+
+exit_with_code 0
--- /dev/null
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="text" encoding="utf-8"/>
+ <xsl:strip-space elements="*"/>
+ <xsl:template match="/">
+ <xsl:for-each select="//check">
+ <xsl:value-of select="@privilege" />
+ <xsl:text>
</xsl:text>
+ </xsl:for-each>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+#!/bin/bash
+
+cmd="xsltproc --nonet --novalid "
+
+privileges=""
+
+for i in `ls ./*.conf`; do
+ new="$($cmd extract_privilege.xsl $i)"
+ privileges="$privileges \
+ $new"
+done
+
+echo "$privileges" | uniq -u
+exit 0
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:svrl="http://purl.oclc.org/dsdl/svrl">
+ <xsl:output method="text" encoding="utf-8"/>
+ <xsl:strip-space elements="*"/>
+
+ <xsl:template match="svrl:failed-assert">
+FAILED(assert)<!-- "<xsl:if test="string-length(@test) <= 20"><xsl:value-of select="@test"/></xsl:if>" --> at <xsl:value-of select="@location"/> : <xsl:value-of select="svrl:text"/>
+ </xsl:template>
+
+ <xsl:template match="svrl:successful-report">
+FAILED(report)<!-- "<xsl:if test="string-length(@test) <= 20"><xsl:value-of select="@test"/></xsl:if>" --> at <xsl:value-of select="@location"/> : <xsl:value-of select="svrl:text"/>
+ </xsl:template>
+
+</xsl:stylesheet>
--- /dev/null
+<?xml version="1.0" standalone="yes"?>
+
+<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron">
+
+ <sch:pattern name="No '*' anywhere">
+ <!-- don't place any more rules here as probably they won't fire -->
+ <sch:rule context="*[@*]">
+ <!-- here we use report, not assert, as report with @*='*' works as "if any attribute matches", while assert @*!='*' works as "if all attributes match" -->
+ <sch:report test="@* = '*'">Rules using "*" are not allowed.</sch:report>
+ </sch:rule>
+ </sch:pattern>
+
+ <sch:pattern name="Default denials not specified (send_destination, own, own_prefix)">
+ <sch:rule context="allow[@send_destination]">
+ <sch:let name="dest_name" value="@send_destination"/>
+ <sch:assert test="//policy[@context='default']/deny[@send_destination = $dest_name]">For each allow send_destination you must add a deny send_destination in default context.</sch:assert>
+ <sch:assert test="//policy[@context='default']/deny[@own = $dest_name]">For each allow send_destination you must add a deny own in default context.</sch:assert>
+ </sch:rule>
+ <sch:rule context="allow[@own]">
+ <sch:let name="dest_name" value="@own"/>
+ <sch:assert test="//policy[@context='default']/deny[@own = $dest_name]">For each allow own you must add a deny own in default context.</sch:assert>
+ </sch:rule>
+ <sch:rule context="allow[@own_prefix]">
+ <sch:let name="dest_name" value="@own_prefix"/>
+ <sch:assert test="//policy[@context='default']/deny[@own_prefix = $dest_name]">For each allow own_prefix you must add a deny own_prefix in default context.</sch:assert>
+ </sch:rule>
+ </sch:pattern>
+
+ <sch:pattern name="Unconstrained allow in default context (or mandatory)">
+ <!-- use true() to issue an error for each allow and not only once per policy -->
+ <sch:rule context="policy[@context = 'default']/allow | policy[@context = 'mandatory']/allow">
+ <sch:report test="true()">Unconstrained allows are not allowed in context default and context mandatory.</sch:report>
+ </sch:rule>
+ </sch:pattern>
+ <!-- additional rule -->
+ <sch:pattern name="Don't depend on global deny-own and deny-method-call">
+ <!-- TODO maybe we can guess somehow the exact dbus name? -->
+ <sch:rule context="busconfig">
+ <sch:assert test="policy[@context='default']">You must provide a policy context-default section.</sch:assert>
+ </sch:rule>
+ <sch:rule context="policy[@context='default']">
+ <sch:assert test="deny[@own]">You must define a 'deny own="yourname"' rule in context-default policy to avoid depending on a global 'deny own="*"'.</sch:assert>
+ <sch:assert test="deny[@send_destination]">You must define a 'deny send_destination="yourname"' rule in context-default policy to avoid depending on a global deny.</sch:assert>
+
+ <!-- TODO what constraints should be made on send_destination and receive sender? -->
+ </sch:rule>
+ </sch:pattern>
+ <!-- -->
+
+
+ <!-- TODO ineffective (masked) rules, TBD -->
+
+ <!-- Duplicate rules in different contexts are processed using same.xsl -->
+
+ <sch:pattern name="No empty policies">
+ <sch:rule context="policy">
+ <sch:report test="not(*)">Empty policy is not allowed.</sch:report>
+ </sch:rule>
+ </sch:pattern>
+
+ <!-- we have to check Cynara privileges outside Schematron as xslt fails when given a rule with 1500 Cynara privileges (as taken from mobile emulator) -->
+ <!--sch:pattern name="Invalid Cynara privilege">
+ <sch:rule context="check">
+ <sch:assert test="PRIVILEGES_TEST">Privilege does not exist.</sch:assert>
+ </sch:rule>
+ </sch:pattern-->
+
+ <sch:pattern name="No at_console rules">
+ <sch:rule context="policy[@at_console]/*">
+ <!-- this will fail on many upstream packages which still have at_console rules despite at_console being deprecated since a long time -->
+ <!-- use true() so that we print an error for every allow/deny, and not only for every policy at_console once -->
+ <sch:report test="true()">You mustn't define rules in at_console contexts (it's deprecated on dbus-daemon systems and not supported on kdbus systems).</sch:report>
+ </sch:rule>
+ </sch:pattern>
+
+ <sch:pattern name="Invalid user">
+ <sch:rule context="*[@user]">
+ <sch:assert test="@user = '*' or USERS_TEST">User does not exist.</sch:assert>
+ </sch:rule>
+ </sch:pattern>
+
+ <sch:pattern name="Invalid group">
+ <sch:rule context="*[@group]">
+ <sch:assert test="@group = '*' or GROUPS_TEST">Group does not exist.</sch:assert>
+ </sch:rule>
+ </sch:pattern>
+
+ <sch:pattern name="No SMACK-context policies">
+ <sch:rule context="policy[@context]">
+ <!-- I have no better idea how to check for SMACK labels. Policies must obey the test below anyway. -->
+ <sch:report test="@context != 'default' and @context != 'mandatory'">You mustn't use SMACK-context policies, use privileges exclusively.</sch:report>
+ </sch:rule>
+ </sch:pattern>
+
+ <sch:pattern name="No user/group rules outside policy context=default|mandatory">
+ <sch:rule context="policy[@user|@group]/deny[@user|@group] | policy[@user|@group]/allow[@user|@group]">
+ <sch:report test="true()">You mustn't allow/deny user/group anywhere except policy context=default|mandatory.</sch:report>
+ </sch:rule>
+ </sch:pattern>
+
+ <sch:pattern name="No eavesdrop rules">
+ <sch:rule context="allow|deny">
+ <sch:report test="@eavesdrop">You mustn't use eavesdrop rules as they are a potential security risk.</sch:report>
+ </sch:rule>
+ </sch:pattern>
+
+ <sch:pattern name="No complex globs">
+ <sch:rule context="*[@*]">
+ <!-- No ends-with() (xpath 2.0 in general) using xsltproc :( -->
+ <sch:report test="string-length(@*) > 1 and substring(@*, string-length(@*)) = '*'">Globs like sth* are not allowed.</sch:report>
+ </sch:rule>
+ </sch:pattern>
+
+ <sch:pattern name="No send_interface without send_destination">
+ <sch:rule context="*[@send_interface]">
+ <sch:assert test="@send_destination">You mustn't use send_interface without send_destination</sch:assert>
+ </sch:rule>
+ <sch:rule context="*[@receive_interface]">
+ <sch:assert test="@receive_sender">You mustn't use receive_interface without receive_sender</sch:assert>
+ </sch:rule>
+ </sch:pattern>
+
+ <sch:pattern name="No send and receive in one rule">
+ <sch:rule context="allow|deny">
+ <sch:report test="(@send_interface or @send_member or @send_error or @send_broadcast or @send_destination or @send_type or @send_path or @send_requested_reply) and (@receive_interface or @receive_member or @receive_error or @receive_sender or @receive_type or @receive_path or @receive_requsted_reply)">You mustn't use send_ and receive_ attributes in one rule.</sch:report>
+ </sch:rule>
+ </sch:pattern>
+
+
+
+
+ <!-- additional rule -->
+ <sch:pattern name="Not implemented in libdbuspolicy">
+ <sch:rule context="allow|deny">
+ <sch:report test="@eavesdrop">eavesdrop rules not implemented on kdbus systems.</sch:report>
+ <sch:report test="@send_error">send_error rules not implemented on kdbus systems.</sch:report>
+ <sch:report test="@receive_error">send_error rules not implemented on kdbus systems.</sch:report>
+ <sch:report test="@send_requested_reply">send_requested_reply rules not implemented on kdbus systems.</sch:report>
+ <sch:report test="@receive_requested_reply">receive_requested_reply rules not implemented on kdbus systems.</sch:report>
+ <sch:report test="@send_broadcast">send_broadcast rules not implemented on kdbus systems.</sch:report>
+ </sch:rule>
+ </sch:pattern>
+
+</sch:schema>
--- /dev/null
+<?xml version="1.0" standalone="yes"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common">
+ <xsl:output method="text" encoding="utf-8"/>
+ <xsl:strip-space elements="*"/>
+
+ <!-- https://stackoverflow.com/questions/38053426/how-to-find-the-difference-between-two-xml-in-xslt -->
+ <xsl:template name="attribute-value-mismatch">
+ <xsl:param name="attributes1" />
+ <xsl:param name="attributes2" />
+ <attribute-match>
+ <xsl:if test="(count($attributes1) != count($attributes2))">
+ <attribute />
+ </xsl:if>
+ <xsl:if test="(count($attributes1) = count($attributes2))">
+ <xsl:for-each select="$attributes1">
+ <xsl:variable name="attribute1" select="."/>
+ <xsl:variable name="result">
+ <attroot>
+ <xsl:for-each select="$attributes2">
+ <xsl:if test="name(.) = name($attribute1/.)">
+ <xsl:if test="not(. = $attribute1/.)">
+ <not-matched-name/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="name(.) != name($attribute1/.)">
+ <not-matched-name/>
+ </xsl:if>
+ </xsl:for-each>
+ </attroot>
+ </xsl:variable>
+ <xsl:if test="count(exslt:node-set($result)//not-matched-name) = count(exslt:node-set($attributes2))">
+ <attribute />
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:if>
+ </attribute-match>
+ </xsl:template>
+
+ <xsl:template name="find-duplicates">
+ <xsl:param name="curr_rule"/>
+ <xsl:param name="other_rules"/>
+ <xsl:variable name="same_rules">
+ <xsl:for-each select="$other_rules">
+ <xsl:if test="local-name()=local-name($curr_rule)">
+ <xsl:variable name="attribute-mismatch">
+ <xsl:call-template name="attribute-value-mismatch">
+ <xsl:with-param name="attributes1" select="./@*"/>
+ <xsl:with-param name="attributes2" select="$curr_rule/@*"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="count(exslt:node-set($attribute-mismatch)//attribute)" />
+ <xsl:if test="count(exslt:node-set($attribute-mismatch)//attribute) = 0"><node/></xsl:if>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="count(exslt:node-set($same_rules)//node)">FAILED(assert) at /busconfig/policy[<xsl:value-of select="1 + count(parent::*/preceding-sibling::policy)"/>]/<xsl:value-of select="local-name($curr_rule)"/>[<xsl:value-of select="1 + count(preceding-sibling::*[local-name()=local-name(current())])"/>] : Duplicate rule.
+</xsl:if>
+ </xsl:template>
+
+ <!-- user vs context, at_console -->
+ <xsl:template match="//policy[@user]/*">
+ <!-- we cannot compare with group policies as we don't know which group rules will be applied to the current user (TODO? supply a user->groups mapping )-->
+ <xsl:call-template name="find-duplicates">
+ <xsl:with-param name="curr_rule" select="."/>
+ <xsl:with-param name="other_rules" select="//policy[@context]/*"/>
+ </xsl:call-template>
+ <xsl:call-template name="find-duplicates">
+ <xsl:with-param name="curr_rule" select="."/>
+ <xsl:with-param name="other_rules" select="//policy[@at_console]/*"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- group vs context, at_console -->
+ <xsl:template match="//policy[@group]/*">
+ <xsl:call-template name="find-duplicates">
+ <xsl:with-param name="curr_rule" select="."/>
+ <xsl:with-param name="other_rules" select="//policy[@context]/*"/>
+ </xsl:call-template>
+ <xsl:call-template name="find-duplicates">
+ <xsl:with-param name="curr_rule" select="."/>
+ <xsl:with-param name="other_rules" select="//policy[@at_console]/*"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- at_console='true' vs context, at_console='false' -->
+ <xsl:template match="//policy[@at_console='true']/*">
+ <xsl:call-template name="find-duplicates">
+ <xsl:with-param name="curr_rule" select="."/>
+ <xsl:with-param name="other_rules" select="//policy[@context]/*"/>
+ </xsl:call-template>
+ <xsl:call-template name="find-duplicates">
+ <xsl:with-param name="curr_rule" select="."/>
+ <xsl:with-param name="other_rules" select="//policy[@at_console='false']/*"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- context='default' vs context='mandatory' -->
+ <xsl:template match="//policy[@context='default']/*">
+ <xsl:call-template name="find-duplicates">
+ <xsl:with-param name="curr_rule" select="."/>
+ <xsl:with-param name="other_rules" select="//policy[@context='mandatory']/*"/>
+ </xsl:call-template>
+ </xsl:template>
+
+</xsl:stylesheet>
--- /dev/null
+<!DOCTYPE busconfig PUBLIC
+ "-//tizen//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.tizen.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+ <policy user="root">
+ </policy>
+
+ <policy context="System::App::Shared">
+ </policy>
+
+ <policy user="foo">
+ <deny user="foo"/>
+ <deny user="owner"/>
+ </policy>
+
+ <policy group="bar">
+ <allow group="bar"/>
+ </policy>
+
+ <policy context="default">
+ <allow own="org.tizen.fido"/>
+ <allow send_destination="org.tizen.fido"/>
+ <allow receive_sender="org.tizen.fido"/>
+
+ <deny user="owner"/>
+ <allow group="owner"/>
+ <deny user="obelix*"/>
+ <deny user="*"/>
+
+ <deny send_interface="org.foo.Bar"/>
+ <allow send_interface="org.foo.Bar"/>
+ <allow receive_interface="org.foo.Bar"/>
+
+ <allow send_interface="org.foo.Bar" send_destination="org.foo"/>
+ <allow receive_interface="org.foo.Bar" receive_sender="org.foo"/>
+
+ <deny send_interface="org.foo.Bar" receive_interface="org.foo.Baz"/>
+
+ <deny own="a.b.c"/>
+ <allow send_destination="a.b.c"/>
+
+ <!-- not implemented in libdbuspolicy -->
+ <allow eavesdrop="false" send_destination="a.b.c"/>
+ <deny eavesdrop="false" send_destination="a.b.c"/>
+ <allow send_destination="a.b.c" send_error="this_error"/>
+ <allow send_destination="a.b.c" receive_error="that_error"/>
+ <allow send_destination="a.b.c" send_requested_reply="true"/>
+ <deny send_destination="a.b.c" receive_requested_reply="false"/>
+ <deny send_destination="a.b.c" send_broadcast="true"/>
+
+ <deny send_destination="org.tizen.alarm.manager"/>
+ <deny own="org.tizen.alarm.manager"/>
+ <deny own_prefix="org.tizen.alarm.managerp"/>
+
+ <check send_destination="c.a.b" send_interface="c.a.b" privilege="http://tizen.org/privilege/packagemanager.admin"/>
+ <check send_destination="c.a.c" send_interface="c.a.c" privilege="http://tizen.org/privilege/packagemanager.nope"/>
+
+ <allow send_interface="same.as.root" send_destination="same.as.root"/>
+ <allow send_interface="same.as.console" send_destination="same.as.console"/>
+ </policy>
+
+ <policy user="root">
+ <allow send_interface="same.as.root" send_destination="same.as.root"/>
+ <allow send_interface="same.as.root" send_destination="same.as.root2"/>
+
+ <allow own_prefix="org.tizen.ldpo"/>
+ <allow own="org.tizen.ldpoga"/>
+ <allow own="org.tizen.ldpogd"/>
+ <allow own="org.tizen.ldposa"/>
+ <allow own="*"/>
+ <allow a="a" own="*"/>
+
+ <deny aaa="a" own_prefix="*"/>
+ <allow own="org.tizen.b.z"/>
+ </policy>
+
+ <policy user="foo">
+ <allow send_interface="same.as.root" send_destination="same.as.root2"/>
+ </policy>
+
+ <policy at_console="true">
+ <allow send_interface="same.as.console" send_destination="same.as.console"/>
+ </policy>
+
+ <policy at_console="false">
+ <allow send_interface="same.as.console" send_destination="same.as.console"/>
+ </policy>
+
+ <policy context="mandatory">
+ <allow send_interface="same.as.console" send_destination="same.as.console"/>
+ </policy>
+
+ <policy user="root">
+ <allow own="org.tizen.alarm.manager"/>
+ <allow own="org.tizen.alarm.manager2"/>
+ <allow own_prefix="org.tizen.alarm.managerp"/>
+ <allow own_prefix="org.tizen.alarm.managerp2"/>
+ <allow send_destination="org.tizen.alarm.manager"/>
+ <allow send_destination="org.tizen.alarm.manager2"/>
+ </policy>
+
+ <policy at_console="true">
+ <allow own="a.b.c"/>
+ <allow own="b.c.d"/>
+ </policy>
+
+ <policy at_console="false">
+ <allow own="a.b.f"/>
+ <allow own="b.c.f"/>
+ </policy>
+
+ <policy context="mandatory">
+ <allow own="org.tizen.fido2"/>
+ </policy>
+
+</busconfig>
+<!-- vim: set ft=xml: -->
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><?xar XSLT?>
+
+<!--
+ OVERVIEW - iso_abstract_expand.xsl
+
+ This is a preprocessor for ISO Schematron, which implements abstract patterns.
+ It also
+ * extracts a particular schema using an ID, where there are multiple
+ schemas, such as when they are embedded in the same NVDL script
+ * allows parameter substitution inside @context, @test, @select, @path
+ * experimentally, allows parameter recognition and substitution inside
+ text (NOTE: to be removed, for compataibility with other implementations,
+ please do not use this)
+
+ This should be used after iso-dsdl-include.xsl and before the skeleton or
+ meta-stylesheet (e.g. iso-svrl.xsl) . It only requires XSLT 1.
+
+ Each kind of inclusion can be turned off (or on) on the command line.
+
+-->
+
+<!--
+Open Source Initiative OSI - The MIT License:Licensing
+[OSI Approved License]
+
+This source code was previously available under the zlib/libpng license.
+Attribution is polite.
+
+The MIT License
+
+Copyright (c) 2004-2010 Rick Jellife and Academia Sinica Computing Centre, Taiwan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+-->
+
+<!--
+VERSION INFORMATION
+ 2013-09-19 RJ
+ * Allow macro expansion in @path attributes, eg. for sch:name/@path
+
+ 2010-07-10 RJ
+ * Move to MIT license
+
+ 2008-09-18 RJ
+ * move out param test from iso:schema template to work with XSLT 1. (Noah Fontes)
+
+ 2008-07-29 RJ
+ * Create. Pull out as distinct XSL in its own namespace from old iso_pre_pro.xsl
+ * Put everything in private namespace
+ * Rewrite replace_substring named template so that copyright is clear
+
+ 2008-07-24 RJ
+ * correct abstract patterns so for correct names: param/@name and
+ param/@value
+
+ 2007-01-12 RJ
+ * Use ISO namespace
+ * Use pattern/@id not pattern/@name
+ * Add Oliver Becker's suggests from old Schematron-love-in list for <copy>
+ * Add XT -ism?
+ 2003 RJ
+ * Original written for old namespace
+ * http://www.topologi.com/resources/iso-pre-pro.xsl
+-->
+<xslt:stylesheet version="1.0" xmlns:xslt="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:iso="http://purl.oclc.org/dsdl/schematron"
+ xmlns:nvdl="http://purl.oclc.org/dsdl/nvdl"
+
+ xmlns:iae="http://www.schematron.com/namespace/iae"
+
+ >
+
+ <xslt:param name="schema-id"></xslt:param>
+
+
+ <!-- Driver for the mode -->
+ <xsl:template match="/">
+ <xsl:apply-templates select="." mode="iae:go" />
+ </xsl:template>
+
+
+ <!-- ================================================================================== -->
+ <!-- Normal processing rules -->
+ <!-- ================================================================================== -->
+ <!-- Output only the selected schema -->
+ <xslt:template match="iso:schema" >
+ <xsl:if test="string-length($schema-id) =0 or @id= $schema-id ">
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="iae:go" />
+ </xslt:copy>
+ </xsl:if>
+ </xslt:template>
+
+
+ <!-- Strip out any foreign elements above the Schematron schema .
+ -->
+ <xslt:template match="*[not(ancestor-or-self::iso:*)]" mode="iae:go" >
+ <xslt:apply-templates mode="iae:go" />
+ </xslt:template>
+
+
+ <!-- ================================================================================== -->
+ <!-- Handle Schematron abstract pattern preprocessing -->
+ <!-- abstract-to-real calls
+ do-pattern calls
+ macro-expand calls
+ multi-macro-expand
+ replace-substring -->
+ <!-- ================================================================================== -->
+
+ <!--
+ Abstract patterns allow you to say, for example
+
+ <pattern name="htmlTable" is-a="table">
+ <param name="row" value="html:tr"/>
+ <param name="cell" value="html:td" />
+ <param name="table" value="html:table" />
+ </pattern>
+
+ For a good introduction, see Uche Ogbujii's article for IBM DeveloperWorks
+ "Discover the flexibility of Schematron abstract patterns"
+ http://www-128.ibm.com/developerworks/xml/library/x-stron.html
+ However, note that ISO Schematron uses @name and @value attributes on
+ the iso:param element, and @id not @name on the pattern element.
+
+ -->
+
+ <!-- Suppress declarations of abstract patterns -->
+ <xslt:template match="iso:pattern[@abstract='true']" mode="iae:go" >
+ <xslt:comment>Suppressed abstract pattern <xslt:value-of select="@id"/> was here</xslt:comment>
+ </xslt:template>
+
+
+ <!-- Suppress uses of abstract patterns -->
+ <xslt:template match="iso:pattern[@is-a]" mode="iae:go" >
+
+ <xslt:comment>Start pattern based on abstract <xslt:value-of select="@is-a"/></xslt:comment>
+
+ <xslt:call-template name="iae:abstract-to-real" >
+ <xslt:with-param name="caller" select="@id" />
+ <xslt:with-param name="is-a" select="@is-a" />
+ </xslt:call-template>
+
+ </xslt:template>
+
+
+
+ <!-- output everything else unchanged -->
+ <xslt:template match="*" priority="-1" mode="iae:go" >
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="iae:go"/>
+ </xslt:copy>
+ </xslt:template>
+
+ <!-- Templates for macro expansion of abstract patterns -->
+ <!-- Sets up the initial conditions for the recursive call -->
+ <xslt:template name="iae:macro-expand">
+ <xslt:param name="caller"/>
+ <xslt:param name="text" />
+ <xslt:call-template name="iae:multi-macro-expand">
+ <xslt:with-param name="caller" select="$caller"/>
+ <xslt:with-param name="text" select="$text"/>
+ <xslt:with-param name="paramNumber" select="1"/>
+ </xslt:call-template>
+
+ </xslt:template>
+
+ <!-- Template to replace the current parameter and then
+ recurse to replace subsequent parameters. -->
+
+ <xslt:template name="iae:multi-macro-expand">
+ <xslt:param name="caller"/>
+ <xslt:param name="text" />
+ <xslt:param name="paramNumber" />
+
+
+ <xslt:choose>
+ <xslt:when test="//iso:pattern[@id=$caller]/iso:param[ $paramNumber]">
+
+ <xslt:call-template name="iae:multi-macro-expand">
+ <xslt:with-param name="caller" select="$caller"/>
+ <xslt:with-param name="paramNumber" select="$paramNumber + 1"/>
+ <xslt:with-param name="text" >
+ <xslt:call-template name="iae:replace-substring">
+ <xslt:with-param name="original" select="$text"/>
+ <xslt:with-param name="substring"
+ select="concat('$', //iso:pattern[@id=$caller]/iso:param[ $paramNumber ]/@name)"/>
+ <xslt:with-param name="replacement"
+ select="//iso:pattern[@id=$caller]/iso:param[ $paramNumber ]/@value"/>
+ </xslt:call-template>
+ </xslt:with-param>
+ </xslt:call-template>
+ </xslt:when>
+ <xslt:otherwise><xslt:value-of select="$text" /></xslt:otherwise>
+
+ </xslt:choose>
+ </xslt:template>
+
+
+ <!-- generate the real pattern from an abstract pattern + parameters-->
+ <xslt:template name="iae:abstract-to-real" >
+ <xslt:param name="caller"/>
+ <xslt:param name="is-a" />
+ <xslt:for-each select="//iso:pattern[@id= $is-a]">
+ <xslt:copy>
+
+ <xslt:choose>
+ <xslt:when test=" string-length( $caller ) = 0">
+ <xslt:attribute name="id"><xslt:value-of select="concat( generate-id(.) , $is-a)" /></xslt:attribute>
+ </xslt:when>
+ <xslt:otherwise>
+ <xslt:attribute name="id"><xslt:value-of select="$caller" /></xslt:attribute>
+ </xslt:otherwise>
+ </xslt:choose>
+
+ <xslt:apply-templates select="*|text()" mode="iae:do-pattern" >
+ <xslt:with-param name="caller"><xslt:value-of select="$caller"/></xslt:with-param>
+ </xslt:apply-templates>
+
+ </xslt:copy>
+ </xslt:for-each>
+ </xslt:template>
+
+
+ <!-- Generate a non-abstract pattern -->
+ <xslt:template mode="iae:do-pattern" match="*">
+ <xslt:param name="caller"/>
+ <xslt:copy>
+ <xslt:for-each select="@*[name()='test' or name()='context' or name()='select' or name()='path' ]">
+ <xslt:attribute name="{name()}">
+ <xslt:call-template name="iae:macro-expand">
+ <xslt:with-param name="text"><xslt:value-of select="."/></xslt:with-param>
+ <xslt:with-param name="caller"><xslt:value-of select="$caller"/></xslt:with-param>
+ </xslt:call-template>
+ </xslt:attribute>
+ </xslt:for-each>
+ <xslt:copy-of select="@*[name()!='test'][name()!='context'][name()!='select'][name()!='path']" />
+ <xsl:for-each select="node()">
+ <xsl:choose>
+ <!-- Experiment: replace macros in text as well, to allow parameterized assertions
+ and so on, without having to have spurious <iso:value-of> calls and multiple
+ delimiting.
+ NOTE: THIS FUNCTIONALITY WILL BE REMOVED IN THE FUTURE -->
+ <xsl:when test="self::text()">
+ <xslt:call-template name="iae:macro-expand">
+ <xslt:with-param name="text"><xslt:value-of select="."/></xslt:with-param>
+ <xslt:with-param name="caller"><xslt:value-of select="$caller"/></xslt:with-param>
+ </xslt:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xslt:apply-templates select="." mode="iae:do-pattern">
+ <xslt:with-param name="caller"><xslt:value-of select="$caller"/></xslt:with-param>
+ </xslt:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xslt:copy>
+ </xslt:template>
+
+ <!-- UTILITIES -->
+ <!-- Simple version of replace-substring function -->
+ <xslt:template name="iae:replace-substring">
+ <xslt:param name="original" />
+ <xslt:param name="substring" />
+ <xslt:param name="replacement" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="not($original)" />
+ <xsl:when test="not(string($substring))">
+ <xsl:value-of select="$original" />
+ </xsl:when>
+ <xsl:when test="contains($original, $substring)">
+ <xsl:variable name="before" select="substring-before($original, $substring)" />
+ <xsl:variable name="after" select="substring-after($original, $substring)" />
+
+ <xsl:value-of select="$before" />
+ <xsl:value-of select="$replacement" />
+ <!-- recursion -->
+ <xsl:call-template name="iae:replace-substring">
+ <xsl:with-param name="original" select="$after" />
+ <xsl:with-param name="substring" select="$substring" />
+ <xsl:with-param name="replacement" select="$replacement" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- no substitution -->
+ <xsl:value-of select="$original" />
+ </xsl:otherwise>
+ </xsl:choose>
+</xslt:template>
+
+
+
+</xslt:stylesheet>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><?xar XSLT?>
+
+<!--
+ OVERVIEW : iso_dsdl_include.xsl
+
+ This is an inclusion preprocessor for the non-smart text inclusions
+ of ISO DSDL. It handles
+ <relax:extRef> for ISO RELAX NG
+ <sch:include> for ISO Schematron and Schematron 1.n
+ <sch:extends> for 2009 draft ISO Schematron
+ <xi:xinclude> simple W3C XIncludes for ISO NVRL and DSRL
+ <crdl:ref> for draft ISO CRDL
+ <dtll:include> for draft ISO DTLL
+ <* @xlink:href> for simple W3C XLink 1.1 embedded links
+
+
+ This should be the first in any chain of processing. It only requires
+ XSLT 1. Each kind of inclusion can be turned off (or on) on the command line.
+
+ Ids in fragment identifiers or xpointers will be sought in the following
+ order:
+ * @xml:id
+ * id() for typed schemas (e.g. from DTD) [NOTE: XInclude does not support this]
+ * untyped @id
+
+ The proposed behaviour for the update to ISO Schematron has been implemented. If an
+ include points to an element with the same name as the parent, then that element's
+ contents will be included. This supports the merge style of inclusion.
+
+ When an inclusion is made, it is preceded by a PI with target DSDL_INCLUDE_START
+ and the href and closed by a PI with target DSDL_INCLUDE_START and the href. This is
+ to allow better location of problems, though only to the file level.
+
+ Limitations:
+ * No rebasing: relative paths will be interpreted based on the initial document's
+ path, not the including document. (Severe limitation!)
+ * No checking for circular references
+ * Not full xpointers: only ID matching
+ * <relax:include> not implemented
+ * XInclude handling of xml:base and xml:lang not implemented
+-->
+<!--
+Open Source Initiative OSI - The MIT License:Licensing
+[OSI Approved License]
+
+This source code was previously available under the zlib/libpng license.
+Attribution is polite.
+
+The MIT License
+
+Copyright (c) 2008-2010 Rick Jelliffe
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+-->
+
+<!--
+ VERSION INFORMATION
+ 2010-07-10
+ * Move to MIT license
+ 2010-04-21
+ * Add basic syntax checks on XPaths belonging to Schematron elements only
+ * Unlocalized messages are put out using xsl:message. The intent is to allow
+ * problems to be caught at compile time.
+ 2009-02-25
+ * Update DSDL namespace to use schematron.com
+ * Tested with SAXON9, Xalan 2.7.1, IE7,
+ * IE does not like multiple variables in same template with same name: rename.
+ 2008-09-18
+ * Remove new behaviour for include, because it conflicts with existing usage [KH]
+ * Add extends[@href] element with that merge functionality
+ * Generate PIs to notate source of inclusions for potential better diagnostics
+
+ 2008-09-16
+ * Fix for XSLT1
+
+ 2008-08-28
+ * New behaviour for schematron includes: if the pointed to element is the same as the current,
+ include the children. [Note: this has been removed: use sch:extends with @href.]
+
+ 2008-08-20
+ * Fix bug: in XSLT1 cannot do $document/id('x') but need to use for-each
+
+ 2008-08-04
+ * Add support for inclusions in old namespace
+
+ 2008-08-03
+ * Fix wrong param name include-relaxng & include-crdl (KH, PH)
+ * Allow inclusion of XSLT and XHTML (KH)
+ * Fix inclusion of fragments (KH)
+
+ 2008-07-25
+ * Add selectable input parameter
+
+ 2008-07-24
+ * RJ New
+-->
+
+<xslt:stylesheet version="1.0"
+ xmlns:xslt="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:iso="http://purl.oclc.org/dsdl/schematron"
+ xmlns:nvdl="http://purl.oclc.org/dsdl/nvdl"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"
+ xmlns:schold="http://www.ascc.net/xml/schematron"
+ xmlns:crdl="http://purl.oclc.org/dsdl/crepdl/ns/structure/1.0"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:dtll="http://www.jenitennison.com/datatypes"
+ xmlns:dsdl="http://www.schematron.com/namespace/dsdl"
+ xmlns:relax="http://relaxng.org/ns/structure/1.0"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+
+
+ xmlns:sch-check="http://www.schematron.com/namespace/sch-check"
+ >
+ <!-- Note: The URL for the dsdl namespace is not official -->
+
+
+ <xsl:param name="include-schematron">true</xsl:param>
+ <xsl:param name="include-crdl">true</xsl:param>
+ <xsl:param name="include-xinclude">true</xsl:param>
+ <xsl:param name="include-dtll">true</xsl:param>
+ <xsl:param name="include-relaxng">true</xsl:param>
+ <xsl:param name="include-xlink">true</xsl:param>
+
+
+ <!-- ========================================================== -->
+ <!-- Output and process contents, check Schematron XPaths too -->
+ <!-- ========================================================== -->
+
+ <xsl:template match="/">
+ <xsl:apply-templates select="." mode="dsdl:go" />
+ </xsl:template>
+
+ <!-- output everything else unchanged. But check Xpaths here. -->
+
+ <xslt:template match="iso:rule[@context]" mode="dsdl:go">
+ <xsl:call-template name="sch-check:xpath-wf-message">
+ <xsl:with-param name="string" select=" @context " />
+ <xsl:with-param name="subject" select=" 'Bad rule: ' " />
+ </xsl:call-template>
+
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xslt:template>
+
+ <xslt:template match="iso:assert[@test]" mode="dsdl:go">
+ <xsl:call-template name="sch-check:xpath-wf-message">
+ <xsl:with-param name="string" select=" @test " />
+ <xsl:with-param name="subject" select=" 'Bad assert: ' " />
+ </xsl:call-template>
+
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xslt:template>
+
+ <xslt:template match="iso:report[@test]" mode="dsdl:go">
+ <xsl:call-template name="sch-check:xpath-wf-message">
+ <xsl:with-param name="string" select=" @test " />
+ <xsl:with-param name="subject" select=" 'Bad report: ' " />
+ </xsl:call-template>
+
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xslt:template>
+
+ <xslt:template match="iso:let[@value]" mode="dsdl:go">
+ <xsl:call-template name="sch-check:xpath-wf-message">
+ <xsl:with-param name="string" select=" @value " />
+ <xsl:with-param name="subject" select=" 'Bad let: ' " />
+ </xsl:call-template>
+
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xslt:template>
+
+
+ <xslt:template match="iso:value-of[@select]" mode="dsdl:go">
+ <xsl:call-template name="sch-check:xpath-wf-message">
+ <xsl:with-param name="string" select=" @select " />
+ <xsl:with-param name="subject" select=" 'Bad value-of: ' " />
+ </xsl:call-template>
+
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xslt:template>
+
+ <xslt:template match="iso:name[@path]" mode="dsdl:go">
+ <xsl:call-template name="sch-check:xpath-wf-message">
+ <xsl:with-param name="string" select=" @select " />
+ <xsl:with-param name="subject" select=" 'Bad name element: ' " />
+ </xsl:call-template>
+
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xslt:template>
+
+ <!-- output everything else unchanged -->
+ <xslt:template match="node()" priority="-1" mode="dsdl:go">
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xslt:template>
+
+
+
+ <!-- =========================================================== -->
+ <!-- ISO/IEC 19757 - DSDL Document Schema Definition Languages -->
+ <!-- Part 2 - Regular grammar-based validation - RELAX NG -->
+ <!-- This only implements relax:extRef not relax:include which -->
+ <!-- is complex. -->
+ <!-- =========================================================== -->
+ <xslt:template match="relax:extRef" mode="dsdl:go">
+
+
+ <!-- Insert subschema -->
+
+ <xsl:variable name="document-uri"
+ select="substring-before(concat(@href,'#'), '#')" />
+ <xsl:variable name="fragment-id"
+ select="substring-after(@href, '#')" />
+
+ <xsl:processing-instruction name="DSDL_INCLUDE_START">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+ <xsl:choose>
+ <xsl:when test="not( $include-relaxng = 'true' )">
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xsl:when>
+ <xsl:otherwise>
+
+ <xsl:choose>
+
+ <xsl:when
+ test="string-length( $document-uri ) = 0 and string-length( $fragment-id ) = 0">
+ <xsl:message>
+ Error: Impossible URL in RELAX NG extRef
+ include
+ </xsl:message>
+ </xsl:when>
+
+ <!-- this case is when there is in embedded schema in the same document elsewhere -->
+ <xslt:when
+ test="string-length( $document-uri ) = 0">
+ <xslt:apply-templates mode="dsdl:go"
+ select="//*[@xml:id= $fragment-id ] | id( $fragment-id) | //*[@id= $fragment-id ]" />
+ </xslt:when>
+
+ <xsl:when
+ test="string-length( $fragment-id ) > 0">
+ <xsl:variable name="theDocument_1"
+ select="document( $document-uri,/ )" />
+
+ <xsl:if test="not($theDocument_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <!-- use a for-each so that the id() function works correctly on the external document -->
+ <xsl:for-each select="$theDocument_1">
+ <xsl:variable name="theFragment_1"
+ select="$theDocument_1//*[@xml:id= $fragment-id ]
+ | id( $fragment-id)
+ | $theDocument_1//*[@id= $fragment-id ]" />
+ <xsl:if test="not($theFragment_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <xsl:apply-templates
+ select=" $theFragment_1[1]" mode="dsdl:go" />
+ </xsl:for-each>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="theDocument_2"
+ select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_2"
+ select="$theDocument_2/*" />
+ <xsl:if test="not($theDocument_2)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not($theFragment_2)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select="$theFragment_2 "
+ mode="dsdl:go" />
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:processing-instruction name="DSDL_INCLUDE_END">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+ </xslt:template>
+
+
+
+ <!-- =========================================================== -->
+ <!-- ISO/IEC 19757 - DSDL Document Schema Definition Languages -->
+ <!-- Part 3 - Rule-based validation - Schematron -->
+ <!-- =========================================================== -->
+
+
+ <!-- Extend the URI syntax to allow # references -->
+ <!-- Add experimental support for simple containers like /xxx:xxx/iso:pattern to allow better includes -->
+ <xsl:template match="iso:include" mode="dsdl:go">
+
+ <xsl:variable name="document-uri"
+ select="substring-before(concat(@href,'#'), '#')" />
+ <xsl:variable name="fragment-id"
+ select="substring-after(@href, '#')" />
+
+
+ <xsl:processing-instruction name="DSDL_INCLUDE_START">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+
+ <xsl:choose>
+ <xsl:when test="not( $include-schematron = 'true' )">
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xsl:when>
+ <xsl:otherwise>
+
+ <xsl:choose>
+
+ <xsl:when
+ test="string-length( $document-uri ) = 0 and string-length( $fragment-id ) = 0">
+ <xsl:message>
+ Error: Impossible URL in Schematron include
+ </xsl:message>
+ </xsl:when>
+
+ <!-- this case is when there is in embedded schema in the same document elsewhere -->
+ <xslt:when
+ test="string-length( $document-uri ) = 0">
+ <xslt:apply-templates mode="dsdl:go"
+ select="//iso:*[@xml:id= $fragment-id ]
+ |id( $fragment-id)
+ | //iso:*[@id= $fragment-id ]" />
+ </xslt:when>
+
+ <!-- case where there is a fragment in another document (should be an iso: element) -->
+ <!-- There are three cases for includes with fragment:
+ 0) No href file or no matching id - error!
+ 1) REMOVED
+
+ 2) The linked-to element is sch:schema however the parent of the include
+ is not a schema. In this case, it is an error. (Actually, it should
+ be an error for other kinds of containment problems, but we won't
+ check for them in this version.)
+
+ 3) Otherwise, include the pointed-to element
+ -->
+
+ <xsl:when
+ test="string-length( $fragment-id ) > 0">
+ <xsl:variable name="theDocument_1"
+ select="document( $document-uri,/ )" />
+ <xsl:variable name="originalParent" select=".." />
+
+ <!-- case 0 -->
+ <xsl:if test="not($theDocument_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <!-- use for-each to rebase id() to external document -->
+ <xsl:for-each select="$theDocument_1">
+ <xsl:variable name="theFragment_1"
+ select=" $theDocument_1//iso:*[@xml:id= $fragment-id ] |
+ id($fragment-id) |
+ $theDocument_1//iso:*[@id= $fragment-id ]" />
+
+
+ <xsl:choose>
+ <!-- case 0 -->
+ <xsl:when test="not($theFragment_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:when>
+
+
+ <!-- case 1 REMOVED -->
+
+ <!-- case 2 -->
+ <xsl:when
+ test=" $theFragment_1/self::iso:schema ">
+ <xsl:message>
+ Schema error: Use include to
+ include fragments, not a whole
+ schema
+ </xsl:message>
+ </xsl:when>
+
+ <!-- case 3 -->
+ <xsl:otherwise>
+ <xsl:apply-templates
+ select=" $theFragment_1[1]" mode="dsdl:go" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:when>
+
+ <!-- Case where there is no ID so we include the whole document -->
+ <!-- Experimental addition: include fragments of children -->
+ <xsl:otherwise>
+ <xsl:variable name="theDocument_2"
+ select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_2"
+ select="$theDocument_2/iso:*" />
+ <xsl:variable name="theContainedFragments"
+ select="$theDocument_2/*/iso:* | $theDocument_2/*/xsl:* | $theDocument_2/*/xhtml:*" />
+ <xsl:if test="not($theDocument_2)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+
+ <!-- There are three cases for includes:
+ 0) No text specified- error!
+
+ 1) REMOVED
+
+ 2) The linked-to element is sch:schema however the parent of the include
+ is not a schema. In this case, it is an error. (Actually, it should
+ be an error for other kinds of containment problems, but we won't
+ check for them in this version.)
+
+ 3) Otherwise, include the pointed-to element
+ -->
+ <xsl:choose>
+ <!-- case 0 -->
+ <xsl:when
+ test="not($theFragment_2) and not ($theContainedFragments)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:when>
+
+ <!-- case 1 removed -->
+
+ <!-- case 2 -->
+ <xsl:when
+ test=" $theFragment_2/self::iso:schema or $theContainedFragments/self::iso:schema">
+ <xsl:message>
+ Schema error: Use include to include
+ fragments, not a whole schema
+ </xsl:message>
+ </xsl:when>
+
+ <!-- If this were XLST 2, we could use
+ if ($theFragment) then $theFragment else $theContainedFragments
+ here (thanks to KN)
+ -->
+ <!-- case 3 -->
+ <xsl:otherwise>
+ <xsl:apply-templates
+ select="$theFragment_2 " mode="dsdl:go" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:processing-instruction name="DSDL_INCLUDE_END">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+ </xsl:template>
+
+
+ <!-- WARNING sch:extends[@href] is experimental and non standard -->
+ <!-- Basically, it adds the children of the selected element, not the element itself. -->
+ <xsl:template match="iso:extends[@href]" mode="dsdl:go">
+
+ <xsl:variable name="document-uri"
+ select="substring-before(concat(@href,'#'), '#')" />
+ <xsl:variable name="fragment-id"
+ select="substring-after(@href, '#')" />
+
+
+ <xsl:processing-instruction name="DSDL_INCLUDE_START">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+
+ <xsl:choose>
+ <xsl:when test="not( $include-schematron = 'true' )">
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xsl:when>
+ <xsl:otherwise>
+
+ <xsl:choose>
+
+ <xsl:when
+ test="string-length( $document-uri ) = 0 and string-length( $fragment-id ) = 0">
+ <xsl:message>
+ Error: Impossible URL in Schematron include
+ </xsl:message>
+ </xsl:when>
+
+ <!-- this case is when there is in embedded schema in the same document elsewhere -->
+ <xslt:when
+ test="string-length( $document-uri ) = 0">
+ <xslt:apply-templates mode="dsdl:go"
+ select="//iso:*[@xml:id= $fragment-id ]/*
+ |id( $fragment-id)/*
+ | //iso:*[@id= $fragment-id ]/*" />
+ </xslt:when>
+
+ <!-- case where there is a fragment in another document (should be an iso: element) -->
+ <!-- There are three cases for includes with fragment:
+ 0) No href file or no matching id - error!
+ 1) REMOVED
+
+ 2) REMOVED
+
+ 3) Otherwise, include the pointed-to element
+ -->
+
+ <xsl:when
+ test="string-length( $fragment-id ) > 0">
+ <xsl:variable name="theDocument_1"
+ select="document( $document-uri,/ )" />
+ <xsl:variable name="originalParent" select=".." />
+
+ <!-- case 0 -->
+ <xsl:if test="not($theDocument_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <!-- use for-each to rebase id() to external document -->
+ <xsl:for-each select="$theDocument_1">
+ <xsl:variable name="theFragment_1"
+ select=" $theDocument_1//iso:*[@xml:id= $fragment-id ] |
+ id($fragment-id) |
+ $theDocument_1//iso:*[@id= $fragment-id ]" />
+
+
+ <xsl:choose>
+ <!-- case 0 -->
+ <xsl:when test="not($theFragment_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:when>
+
+
+ <!-- case 1 REMOVED -->
+
+ <!-- case 2 REMOVED -->
+
+
+ <!-- case 3 -->
+ <xsl:otherwise>
+
+ <xsl:apply-templates
+ select=" $theFragment_1[1]/*" mode="dsdl:go" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:when>
+
+ <!-- Case where there is no ID so we include the whole document -->
+ <!-- Experimental addition: include fragments of children -->
+ <xsl:otherwise>
+ <xsl:variable name="theDocument_2"
+ select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_2"
+ select="$theDocument_2/iso:*" />
+ <xsl:variable name="theContainedFragments"
+ select="$theDocument_2/*/iso:* | $theDocument_2/*/xsl:* | $theDocument_2/*/xhtml:*" />
+ <xsl:if test="not($theDocument_2)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+
+ <!-- There are three cases for includes:
+ 0) No text specified- error!
+
+ 1) REMOVED
+
+ 2) REMOVED
+
+ 3) Otherwise, include the pointed-to element
+ -->
+ <xsl:choose>
+ <!-- case 0 -->
+ <xsl:when
+ test="not($theFragment_2) and not ($theContainedFragments)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:when>
+
+ <!-- case 1 removed -->
+
+ <!-- case 2 removed -->
+
+ <!-- If this were XLST 2, we could use
+ if ($theFragment) then $theFragment else $theContainedFragments
+ here (thanks to KN)
+ -->
+ <!-- case 3 -->
+ <xsl:otherwise>
+ <xsl:apply-templates
+ select="$theFragment_2/* " mode="dsdl:go" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:processing-instruction name="DSDL_INCLUDE_END">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+ </xsl:template>
+
+
+
+ <!-- =========================================================== -->
+ <!-- Handle Schematron 1.6 inclusions: clone of ISO code above -->
+ <!-- =========================================================== -->
+
+
+ <!-- Extend the URI syntax to allow # references -->
+ <!-- Add experimental support for simple containers like /xxx:xxx/schold:pattern to allow better includes -->
+ <xsl:template match="schold:include" mode="dsdl:go">
+ <xsl:variable name="document-uri"
+ select="substring-before(concat(@href,'#'), '#')" />
+ <xsl:variable name="fragment-id"
+ select="substring-after(@href, '#')" />
+
+ <xsl:processing-instruction name="DSDL_INCLUDE_START">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+
+ <xsl:choose>
+ <xsl:when test="not( $include-schematron = 'true' )">
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+
+ <xsl:when
+ test="string-length( $document-uri ) = 0 and string-length( $fragment-id ) = 0">
+ <xsl:message>
+ Error: Impossible URL in Schematron include
+ </xsl:message>
+ </xsl:when>
+
+ <!-- this case is when there is in embedded schema in the same document elsewhere -->
+ <xslt:when
+ test="string-length( $document-uri ) = 0">
+ <xslt:apply-templates mode="dsdl:go"
+ select="//schold:*[@xml:id= $fragment-id ]
+ |id( $fragment-id)
+ | //schold:*[@id= $fragment-id ]" />
+ </xslt:when>
+
+ <!-- case where there is a fragment in another document (should be an iso: element) -->
+ <xsl:when
+ test="string-length( $fragment-id ) > 0">
+ <xsl:variable name="theDocument_1"
+ select="document( $document-uri,/ )" />
+ <xsl:if test="not($theDocument_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <!-- use for-each to rebase id() to $theDocument -->
+ <xsl:for-each select="$theDocument_1">
+ <xsl:variable name="theFragment_1"
+ select=" $theDocument_1//schold:*[@xml:id= $fragment-id ] |
+ id($fragment-id) |
+ $theDocument_1//schold:*[@id= $fragment-id ]" />
+ <xsl:if
+ test=" $theFragment_1/self::schold:schema ">
+ <xsl:message>
+ Schema error: Use include to include
+ fragments, not a whole schema
+ </xsl:message>
+ </xsl:if>
+ <xsl:if test="not($theFragment_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <xsl:apply-templates
+ select=" $theFragment_1[1]" mode="dsdl:go" />
+ </xsl:for-each>
+ </xsl:when>
+
+ <!-- Case where there is no ID so we include the whole document -->
+ <!-- Experimental addition: include fragments of children -->
+ <xsl:otherwise>
+ <xsl:variable name="theDocument_2"
+ select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_2"
+ select="$theDocument_2/iso:*" />
+ <xsl:variable name="theContainedFragments"
+ select="$theDocument_2/*/schold:* | $theDocument_2/*/xsl:* | $theDocument_2/*/xhtml:*" />
+ <xsl:if test="not($theDocument_2)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if
+ test=" $theFragment_2/self::schold:schema or $theContainedFragments/self::schold:schema">
+ <xsl:message>
+ Schema error: Use include to include
+ fragments, not a whole schema
+ </xsl:message>
+ </xsl:if>
+ <xsl:if
+ test="not($theFragment_2) and not ($theContainedFragments)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <!-- If this were XLST 2, we could use
+ if ($theFragment) then $theFragment else $theContainedFragments
+ here (thanks to KN)
+ -->
+ <xsl:choose>
+ <xsl:when test=" $theFragment_2 ">
+ <xsl:apply-templates
+ select="$theFragment_2 " mode="dsdl:go" />
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- WARNING! EXPERIMENTAL! Use at your own risk. This may be discontinued! -->
+ <xsl:apply-templates
+ select=" $theContainedFragments " mode="dsdl:go" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:processing-instruction name="DSDL_INCLUDE_END">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+ </xsl:template>
+ <!-- =========================================================== -->
+ <!-- ISO/IEC 19757 - DSDL Document Schema Definition Languages -->
+ <!-- Part 5 - DataType Library Language - DTLL -->
+ <!-- Committee Draft Experimental support only -->
+ <!-- The <include> element may well be replaced by XInclude in -->
+ <!-- any final version. -->
+ <!-- =========================================================== -->
+ <xslt:template match="dtll:include" mode="dsdl:go">
+ <!-- Insert subschema -->
+
+ <xsl:variable name="document-uri"
+ select="substring-before(concat(@href,'#'), '#')" />
+ <xsl:variable name="fragment-id"
+ select="substring-after(@href, '#')" />
+ <xsl:processing-instruction name="DSDL_INCLUDE_START">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+ <xsl:choose>
+ <xsl:when test="not( $include-dtll = 'true' )">
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+
+ <xsl:when
+ test="string-length( $document-uri ) = 0 and string-length( $fragment-id ) = 0">
+ <xsl:message>
+ Error: Impossible URL in DTLL include
+ </xsl:message>
+ </xsl:when>
+
+ <!-- this case is when there is in embedded schema in the same document elsewhere -->
+ <xslt:when
+ test="string-length( $document-uri ) = 0">
+ <xslt:apply-templates mode="dsdl:go"
+ select="//*[@xml:id= $fragment-id ] | id( $fragment-id)
+ | //*[@id= $fragment-id ]" />
+ </xslt:when>
+
+ <xsl:when
+ test="string-length( $fragment-id ) > 0">
+ <xsl:variable name="theDocument_1"
+ select="document( $document-uri,/ )" />
+ <xsl:if test="not($theDocument_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <!-- use for-each to rebase id() to $theDocument -->
+ <xsl:for-each select="$theDocument_1">
+ <xsl:variable name="theFragment_1"
+ select="$theDocument_1//*[@xml:id= $fragment-id ]
+ | id( $fragment-id )
+ | $theDocument_1//*[@id= $fragment-id ]" />
+ <xsl:if test="not($theFragment_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <xsl:apply-templates
+ select=" $theFragment_1[1]" mode="dsdl:go" />
+ </xsl:for-each>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="theDocument_2"
+ select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_2"
+ select="$theDocument_2/*" />
+
+ <xsl:if test="not($theDocument_2)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not($theFragment_2)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select="$theFragment_2 "
+ mode="dsdl:go" />
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:processing-instruction name="DSDL_INCLUDE_END">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+ </xslt:template>
+
+ <!-- =========================================================== -->
+ <!-- ISO/IEC 19757 - DSDL Document Schema Definition Languages -->
+ <!-- Part 7 - Character Repertoire Description Language - CRDL -->
+ <!-- Final Committee Draft 2008-01-11 Experimental support only -->
+ <!-- =========================================================== -->
+ <xslt:template match="crdl:ref" mode="dsdl:go">
+ <!-- Insert subschema -->
+
+ <xsl:variable name="document-uri"
+ select="substring-before(concat(@href,'#'), '#')" />
+ <xsl:variable name="fragment-id"
+ select="substring-after(@href, '#')" />
+ <xsl:processing-instruction name="DSDL_INCLUDE_START">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+ <xsl:choose>
+ <xsl:when test="not( $include-crdl = 'true' )">
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+
+ <xsl:when
+ test="string-length( $document-uri ) = 0 and string-length( $fragment-id ) = 0">
+ <xsl:message>
+ Error: Impossible URL in CRDL include
+ </xsl:message>
+ </xsl:when>
+
+ <!-- this case is when there is in embedded schema in the same document elsewhere -->
+ <xslt:when
+ test="string-length( $document-uri ) = 0">
+
+ <xslt:apply-templates mode="dsdl:go"
+ select="//*[@xml:id= $fragment-id ] | id( $fragment-id)
+ | //*[@id= $fragment-id ]" />
+ </xslt:when>
+
+ <xsl:when
+ test="string-length( $fragment-id ) > 0">
+ <xsl:variable name="theDocument_1"
+ select="document( $document-uri,/ )" />
+ <xsl:if test="not($theDocument_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <!-- use for-each to rebase id() to $theDocument -->
+ <xsl:for-each select="$theDocument_1">
+ <xsl:variable name="theFragment_1"
+ select="$theDocument_1//*[@xml:id= $fragment-id ]
+ | id( $fragment-id )
+ | $theDocument_1//*[@id= $fragment-id ]" />
+
+ <xsl:if test="not($theFragment_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select=" $theFragment_1 "
+ mode="dsdl:go" />
+ </xsl:for-each>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="theDocument_2"
+ select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_2"
+ select="$theDocument_2/*" />
+
+ <xsl:if test="not($theDocument_2)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+ <xsl:if test="not($theFragment_2)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:apply-templates select="$theFragment_2"
+ mode="dsdl:go" />
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:processing-instruction name="DSDL_INCLUDE_END">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+ </xslt:template>
+
+
+ <!-- =========================================================== -->
+ <!-- ISO/IEC 19757 - DSDL Document Schema Definition Languages -->
+ <!-- Part 4 - Namespace-based Validation Dispatching Language - NVDL -->
+ <!-- Note: This does not include schemas referenced for -->
+ <!-- validation, it merely handles any simple XIncludes -->
+ <!-- =========================================================== -->
+ <!-- ISO/IEC 19757 - DSDL Document Schema Definition Languages -->
+ <!-- Part 8 - Document Schema Renaming Language - DSRL -->
+ <!-- Note: Final? Committee Draft Experimental support only -->
+ <!-- =========================================================== -->
+ <!-- XInclude support for id based references only, with 1 level -->
+ <!-- of fallback. -->
+ <!-- =========================================================== -->
+
+ <xslt:template mode="dsdl:go"
+ match="xi:include[@href][not(@parseType) or @parseType ='xml']">
+ <!-- Simple inclusions only here -->
+ <xsl:processing-instruction name="DSDL_INCLUDE_START">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+ <xsl:choose>
+ <xsl:when test="not( $include-xinclude = 'true' )">
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+
+ <xsl:when test="contains( @href, '#')">
+ <xsl:message terminate="yes">
+ Fatal error: Xinclude href contains fragment
+ identifier #
+ </xsl:message>
+ </xsl:when>
+
+
+ <xsl:when test="contains( @xpointer, '(')">
+ <xsl:message terminate="yes">
+ Fatal error: Sorry, this software only
+ supports simple ids in XInclude xpointers
+ </xsl:message>
+ </xsl:when>
+
+ <xsl:when
+ test="string-length( @href ) = 0 and string-length( @xpointer ) = 0">
+
+ <xsl:message terminate="yes">
+ Fatal Error: Impossible URL in XInclude
+ include
+ </xsl:message>
+ </xsl:when>
+
+ <!-- this case is when there is in embedded schema in the same document elsewhere -->
+ <xslt:when test="string-length( @href ) = 0">
+
+ <xslt:apply-templates mode="dsdl:go"
+ select="//*[@xml:id= current()/@xpointer ] | id( @xpointer)
+ | //*[@id= current()/@xpointer ]" />
+ </xslt:when>
+
+ <xsl:when
+ test="string-length( @xpointer ) > 0">
+ <xsl:variable name="theDocument_1"
+ select="document( @href,/ )" />
+ <xsl:variable name="theFragment_1"
+ select="$theDocument_1//*[@xml:id= current()/@xpointer ]
+
+ | $theDocument_1//*[@id= current()/@xpointer ]" />
+ <!-- removed
+ | $theDocument_1/id( @xpointer)
+ because it requires rebasing in XSLT1 and that would mess up the use of current()
+ -->
+
+
+ <!-- Allow one level of fallback, to another XInclude -->
+ <xsl:if test="not($theDocument_1)">
+ <xsl:choose>
+ <xsl:when test="xi:fallback">
+ <xsl:variable name="theDocument_2"
+ select="document( xi:fallback[1]/xi:include[not(@parseType)
+ or @parseType='xml']/@href,/ )" />
+ <xsl:variable name="theFragment_2"
+ select="$theDocument_2//*[@xml:id= current()/xi:fallback[1]/xi:include/@xpointer ]
+ | $theDocument_2//*[@id= current()/xi:fallback[1]/xi:include/@xpointer ]" />
+ <!-- removed
+ | $theDocument_2/id( xi:fallback[1]/xi:include/@xpointer)
+ because it id() would need rebasing in XSLT1 and that would mess up use of current()
+ -->
+
+ <xsl:if
+ test="not($theDocument_2)">
+
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file and fallback
+ file: </xsl:text>
+ <xsl:value-of
+ select="@href" />
+ </xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:apply-templates select=" $theFragment_1"
+ mode="dsdl:go" />
+ </xsl:when>
+
+ <!-- Document but no fragment specified -->
+ <xsl:otherwise>
+ <xsl:variable name="theDocument_3"
+ select="document( @href,/ )" />
+ <xsl:variable name="theFragment_3"
+ select="$theDocument_3/*" />
+
+ <xsl:if test="not($theDocument_3)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@href" />
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:apply-templates select="$theFragment_3 "
+ mode="dsdl:go" />
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:processing-instruction name="DSDL_INCLUDE_END">
+ <xsl:value-of select="@href" />
+ </xsl:processing-instruction>
+ </xslt:template>
+
+ <!-- =========================================================== -->
+ <!-- W3C XLink 1.1 embedded simple links -->
+ <!-- =========================================================== -->
+ <xslt:template
+ match="*[@xlink:href][not(parent::*[@xlink:type='complex'])]
+ [not(@xlink:type) or (@xlink:type='simple')]
+ [@xlink:show='embed']
+ [not(@xlink:actuate) or (@xlink:actuate='onLoad')]"
+ mode="dsdl:go" priority="1">
+
+ <xsl:variable name="document-uri"
+ select="substring-before(concat(@xlink:href,'#'), '#')" />
+ <xsl:variable name="fragment-id"
+ select="substring-after(@xlink:href, '#')" />
+ <xsl:processing-instruction name="DSDL_INCLUDE_START">
+ <xsl:value-of select="@xlink:href" />
+ </xsl:processing-instruction>
+ <xsl:choose>
+ <xsl:when test="not( $include-xlink = 'true' )">
+ <xslt:copy>
+ <xslt:copy-of select="@*" />
+ <xslt:apply-templates mode="dsdl:go" />
+ </xslt:copy>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+
+ <xsl:when
+ test="string-length( $document-uri ) = 0 and string-length( $fragment-id ) = 0">
+ <xsl:message>
+ Error: Impossible URL in XLink embedding
+ link
+ </xsl:message>
+ </xsl:when>
+
+ <!-- this case is when there is in embedded schema in the same document elsewhere -->
+ <xslt:when
+ test="string-length( $document-uri ) = 0">
+ <xslt:apply-templates mode="dsdl:go"
+ select="//*[@xml:id= $fragment-id ] | id( $fragment-id)
+ | //*[@id= $fragment-id ]" />
+ </xslt:when>
+
+ <xsl:when
+ test="string-length( $fragment-id ) > 0">
+ <xsl:variable name="theDocument_1"
+ select="document( $document-uri,/ )" />
+ <xsl:if test="not($theDocument_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@xlink:href" />
+ </xsl:message>
+ </xsl:if>
+ <!-- use for-each to rebase id() to $theDocument -->
+ <xsl:for-each select="$theDocument_1">
+ <xsl:variable name="theFragment_1"
+ select="$theDocument_1//*[@xml:id= $fragment-id ]
+ | id( $fragment-id )
+ | $theDocument_1//*[@id= $fragment-id ]" />
+ <xsl:if test="not($theFragment_1)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@xlink:href" />
+ </xsl:message>
+ </xsl:if>
+ <xsl:apply-templates
+ select=" $theFragment_1[1]" mode="dsdl:go" />
+ </xsl:for-each>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="theDocument_2"
+ select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_2"
+ select="$theDocument_2/*" />
+
+ <xsl:if test="not($theDocument_2)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to open referenced included file: </xsl:text>
+ <xsl:value-of select="@xlink:href" />
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not($theFragment_2)">
+ <xsl:message terminate="no">
+ <xsl:text>Unable to locate id attribute: </xsl:text>
+ <xsl:value-of select="@xlink:href" />
+ </xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select="$theFragment_2 "
+ mode="dsdl:go" />
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:processing-instruction name="DSDL_INCLUDE_END">
+ <xsl:value-of select="@xlink:href" />
+ </xsl:processing-instruction>
+ </xslt:template>
+
+<!-- ================================================================= -->
+<!-- UTILITY TEMPLATES -->
+<!-- ================================================================= -->
+
+<!-- MESSAGE WHEN XPATH NOT WELL FORMED -->
+
+<xsl:template name="sch-check:xpath-wf-message" >
+ <xsl:param name="string" />
+ <xsl:param name="subject" />
+ <xsl:variable name="xpath-wf-result">
+ <xsl:call-template name="sch-check:xpath-wf">
+ <xsl:with-param name="string" select=" $string " />
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="string-length($xpath-wf-result) > 0">
+ <xsl:message><xsl:value-of select="$subject"/><xsl:value-of select="$xpath-wf-result" /></xsl:message>
+ </xsl:if>
+ </xsl:template>
+
+<!-- XPATH WELL FORMED -->
+
+<xsl:template name="sch-check:xpath-wf" >
+ <xsl:param name="string" />
+ <!-- This does some minimal checks to see if a string is well-formed XPath.
+ It checks
+ 1) String is not empty,
+ 2) equal number of open and close parens
+ 3) equal number of left and right square brackets
+ 4) if there is a predicate open immediately following a step separator
+ It does not check balancing. It does not check inside string literals in XPaths.
+
+ If there is no error, empty content is returned. If there is an error, it is given
+ as an error message. This is not localized yet.
+ -->
+
+
+ <xsl:variable name="stripped-contents">
+ <xsl:call-template name="sch-check:strip-strings" >
+ <xsl:with-param name="string" select=" $string " />
+ <xsl:with-param name="mode" select=" 0" />
+ </xsl:call-template>
+ </xsl:variable>
+
+
+ <xsl:variable name="paren-result">
+ <xsl:call-template name="sch-check:test-paren" >
+ <xsl:with-param name="string" select="$stripped-contents" />
+ <xsl:with-param name="count" select=" 0" />
+ </xsl:call-template>
+ </xsl:variable>
+
+
+ <xsl:variable name="sqb-result">
+ <xsl:call-template name="sch-check:test-sqb" >
+ <xsl:with-param name="string" select="$stripped-contents" />
+ <xsl:with-param name="count" select=" 0" />
+ </xsl:call-template>
+ </xsl:variable>
+
+
+ <xsl:choose>
+ <xsl:when test="string-length( normalize-space($string)) = 0"
+ >XPath error. No XPath.</xsl:when>
+ <xsl:when test="contains( $stripped-contents, '/[' )"
+ >XPath error. Missing location step. Suggestion: remove '/' before '['.
+ <xsl:value-of select=" normalize-space($string)"/></xsl:when>
+ <!-- not implemented yet
+ <xsl:when test=" count () mod 2 = 1"
+ >XPath syntax error. Odd number of apostrophe characters. Suggestion: check string termination and delimiting.
+ <xsl:value-of select=" normalize-space($string)"/></xsl:when>
+ <xsl:when test=" count ( ) mod 2 = 1"
+ >XPath syntax error. Odd number of quote characters. Suggestion: check string termination and delimiting.
+ <xsl:value-of select=" normalize-space($string)"/></xsl:when>
+ -->
+ <xsl:when test=" $paren-result > 0 "
+ >XPath syntax error. Unclosed parenthesis. Suggestion: add ')'.
+ <xsl:value-of select=" normalize-space($string)"/></xsl:when>
+ <xsl:when test=" $paren-result < 0 "
+ >XPath syntax error. Extra close parenthesis. Suggestion: remove ')'.
+ <xsl:value-of select=" normalize-space($string)"/></xsl:when>
+
+ <xsl:when test=" $sqb-result > 0 "
+ >XPath syntax error. Unclosed left square bracket. Suggestion: add ']'.
+ <xsl:value-of select=" normalize-space($string)"/></xsl:when>
+ <xsl:when test=" $sqb-result < 0 "
+ >XPath syntax error. Extra right square bracket. Suggestion: remove ']'.
+ <xsl:value-of select=" normalize-space($string)"/></xsl:when>
+
+ </xsl:choose>
+
+
+
+</xsl:template>
+
+
+<!-- STRIP XPATH STRINGS -->
+<xsl:template name="sch-check:strip-strings">
+ <xsl:param name="string" />
+ <xsl:param name="mode" />
+
+ <!--
+ mode 0 = outside string
+ mode 1 = in double quote string
+ mode 2 = in single quote string
+ -->
+ <xsl:choose>
+ <xsl:when test=" string-length( $string) = 0" />
+ <xsl:when test="$mode = 1 ">
+ <xsl:choose>
+
+
+ <xsl:when test="starts-with( $string, '""') " >
+
+ <xsl:call-template name="sch-check:strip-strings">
+ <xsl:with-param name="string" select=" substring ( $string, 3 )"/>
+ <xsl:with-param name="mode" select=" $mode" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="starts-with( $string, '"') " >
+ <xsl:call-template name="sch-check:strip-strings">
+ <xsl:with-param name="string" select=" substring ( $string, 2 )"/>
+ <xsl:with-param name="mode" select=" 0 " />
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="sch-check:strip-strings">
+ <xsl:with-param name="string" select=" substring ( $string, 2 )"/>
+ <xsl:with-param name="mode" select=" $mode " />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$mode = 2 ">
+ <xsl:choose>
+
+ <!-- doubled double quote or double apos is an escape -->
+ <xsl:when test="starts-with( $string, "''") " >
+ <xsl:call-template name="sch-check:strip-strings">
+ <xsl:with-param name="string" select=" substring ( $string, 3 )"/>
+ <xsl:with-param name="mode" select=" $mode" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="starts-with( $string, "'" )" >
+ <xsl:call-template name="sch-check:strip-strings">
+ <xsl:with-param name="string" select=" substring ( $string, 2 )"/>
+ <xsl:with-param name="mode" select=" 0 " />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sch-check:strip-strings">
+ <xsl:with-param name="string" select=" substring ( $string, 2 )"/>
+ <xsl:with-param name="mode" select=" $mode " />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise> <!-- mode = 0 -->
+ <xsl:choose>
+ <xsl:when test="starts-with( $string, '"')" >
+ <xsl:call-template name="sch-check:strip-strings">
+ <xsl:with-param name="string" select=" substring ( $string, 2 )"/>
+ <xsl:with-param name="mode" select=" 1 " />
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="starts-with( $string, "'" )" >
+ <xsl:call-template name="sch-check:strip-strings">
+ <xsl:with-param name="string" select=" substring ( $string, 2 )"/>
+ <xsl:with-param name="mode" select=" 2 " />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="substring( $string, 1, 1)" />
+ <xsl:call-template name="sch-check:strip-strings">
+
+ <xsl:with-param name="string" select=" substring ( $string, 2 )"/>
+ <xsl:with-param name="mode" select=" $mode " />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+
+</xsl:template>
+
+ <!-- COUNT THE NUMBER OF UNMATCHED PARENTHESES -->
+ <!-- Limitation: Does not check balancing. -->
+
+<xsl:template name="sch-check:test-paren">
+ <xsl:param name="string" />
+ <xsl:param name="count" />
+
+ <xsl:choose>
+ <xsl:when test=" string-length( $string) = 0">
+ <xsl:value-of select=" $count " />
+ </xsl:when>
+ <xsl:when test=" starts-with( $string, '(') ">
+ <xsl:call-template name="sch-check:test-paren">
+ <xsl:with-param name="string" select=" substring ( $string, 2 )" />
+ <xsl:with-param name="count" select=" $count + 1 " />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test=" starts-with( $string, ')') ">
+ <xsl:call-template name="sch-check:test-paren">
+ <xsl:with-param name="string" select=" substring ( $string, 2 )"/>
+ <xsl:with-param name="count" select="$count - 1 " />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sch-check:test-paren">
+ <xsl:with-param name="string" select=" substring ( $string, 2 )"/>
+ <xsl:with-param name="count" select=" $count " />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+
+</xsl:template>
+
+
+ <!-- COUNT THE NUMBER OF SQUARE BRACKETS -->
+ <!-- Limitation: Does not check balancing. -->
+<xsl:template name="sch-check:test-sqb">
+ <xsl:param name="string" />
+ <xsl:param name="count" />
+
+ <xsl:choose>
+ <xsl:when test=" string-length( $string) = 0">
+ <xsl:value-of select=" $count " />
+ </xsl:when>
+ <xsl:when test=" starts-with( $string, '[') ">
+ <xsl:call-template name="sch-check:test-sqb">
+ <xsl:with-param name="string" select=" substring ( $string, 2 )" />
+ <xsl:with-param name="count" select=" $count + 1 " />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test=" starts-with( $string, ']') ">
+ <xsl:call-template name="sch-check:test-sqb">
+ <xsl:with-param name="string" select=" substring ( $string, 2 )"/>
+ <xsl:with-param name="count" select="$count - 1 " />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sch-check:test-sqb">
+ <xsl:with-param name="string" select=" substring ( $string, 2 )"/>
+ <xsl:with-param name="count" select=" $count " />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+
+</xsl:template>
+
+
+
+
+
+</xslt:stylesheet>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" ?><?xar XSLT?>
+<!-- Implementation for the Schematron XML Schema Language.
+ Generates simple text output messages using XSLT1 engine
+-->
+<!--
+Open Source Initiative OSI - The MIT License:Licensing
+[OSI Approved License]
+
+This source code was previously available under the zlib/libpng license.
+Attribution is polite.
+
+The MIT License
+
+Copyright (c) 2000-2010 Rick Jellife and Academia Sinica Computing Centre, Taiwan.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+-->
+
+<!-- Schematron message -->
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias">
+
+<xsl:import href="iso_schematron_skeleton_for_xslt1.xsl"/>
+
+<xsl:template name="process-prolog">
+ <axsl:output method="text" />
+</xsl:template>
+
+<!-- use default rule for process-root: copy contens / ignore title -->
+<!-- use default rule for process-pattern: ignore name and see -->
+<!-- use default rule for process-name: output name -->
+<!-- use default rule for process-assert and process-report:
+ call process-message -->
+
+<xsl:template name="process-message">
+ <xsl:param name="pattern" />
+ <xsl:param name="role" />
+ <axsl:message>
+ <xsl:apply-templates mode="text"
+ /> (<xsl:value-of select="$pattern" />
+ <xsl:if test="$role"> / <xsl:value-of select="$role" />
+ </xsl:if>)</axsl:message>
+</xsl:template>
+
+</xsl:stylesheet>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" ?><?xar XSLT?>
+<!-- Implementation for the Schematron XML Schema Language.
+ Generates simple text output messages using XSLT2 engine
+-->
+<!--
+Open Source Initiative OSI - The MIT License:Licensing
+[OSI Approved License]
+
+This source code was previously available under the zlib/libpng license.
+Attribution is polite.
+
+The MIT License
+
+Copyright (c) 2000-2010 Rick Jellife and Academia Sinica Computing Centre, Taiwan.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+-->
+
+<!-- Schematron message -->
+
+<xsl:stylesheet
+ version="2.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias">
+
+<xsl:import href="iso_schematron_skeleton_for_saxon.xsl"/>
+
+<xsl:template name="process-prolog">
+ <axsl:output method="text" />
+</xsl:template>
+
+<!-- use default rule for process-root: copy contens / ignore title -->
+<!-- use default rule for process-pattern: ignore name and see -->
+<!-- use default rule for process-name: output name -->
+<!-- use default rule for process-assert and process-report:
+ call process-message -->
+
+<xsl:template name="process-message">
+ <xsl:param name="pattern" />
+ <xsl:param name="role" />
+ <axsl:message>
+ <xsl:apply-templates mode="text"
+ /> (<xsl:value-of select="$pattern" />
+ <xsl:if test="$role"> / <xsl:value-of select="$role" />
+ </xsl:if>)</axsl:message>
+</xsl:template>
+
+</xsl:stylesheet>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0"?><?xar XSLT?>
+
+<!--
+ OVERVIEW
+
+ ASCC/Schematron.com Skeleton Module for ISO Schematron (for XSLT2 systems)
+
+ ISO Schematron is a language for making assertion about the presence or absense
+ of patterns in XML documents. It is typically used for as a schema language, or
+ to augment existing schema languages, and to check business rules. It is very
+ powerful, yet quite simple: a developer only need know XPath and about five other
+ elements.
+
+ This is an open source implementation of ISO Schematron in XSLT. Although ISO does
+ not allow reference implementations which might compete with the text of the
+ standard, this code has been compiled by Rick Jelliffe, inventor of Schematron
+ and editor of the ISO standard; so developers can certainly use it as an
+ unofficial reference implementation for clarification.
+
+ This implementation is based on one by Oliver Becker. API documentation is
+ available separately; try www.schematron.com for this. Funding for this
+ stylesheet over the years has come from Topologi Pty. Ltd., Geotempo Ltd.,
+ and ASCC, Tapei.
+
+ There are two versions of this skeleton: one is tailored for XSLT1 processors
+ and the other is tailored for XSLT2 processors. Future versions of the
+ XSLT2 skeleton may support more features than that the XSLT 1 skeleton.
+-->
+
+<!--
+Open Source Initiative OSI - The MIT License:Licensing
+[OSI Approved License]
+
+This source code was previously available under the zlib/libpng license.
+Attribution is polite.
+
+The MIT License
+
+Copyright (c) 2000-2010 Rick Jellife and Academia Sinica Computing Centre, Taiwan.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+-->
+<!--
+ TIPS
+
+ A tip for new users of Schematron: make your assertions contain positive messages
+ about what is expected, rather than error messages. For example, use the form
+ "An X should have a Y, because Z".
+
+ Another tip is that Schematron provides an
+ element <iso:ns> for declaring the namespaces and prefixes used in Xpaths in
+ attribute values; it does not extend the XML Namespaces mechanism: if a name
+ in an XPath has a prefix, there must be an <iso:ns> element for that prefix; if
+ a name in an XPath does not have a prefix, it is always in no namespace.
+
+ A tip for implementers of Schematron, either using this API or re-implementing it:
+ make the value of the diagnostics, flags and richer features available if possible;
+ Schematron has many of the optional richer features which, if implemented, provide
+ a compelling alternative approach to validation and business-rules checking compared
+ to other schema languages and programs.
+
+ If you create your own meta-stylesheet to override this one, it is a
+ good idea to have both in the same directory and to run the stylesheet
+ from that directory, as many XSLT implementations have ideosyncratic
+ handling of URLs: keep it simple.
+-->
+
+
+<!--
+ INVOCATION INFORMATION
+
+ The following parameters are available
+
+ phase NMTOKEN | "#ALL" (default) Select the phase for validation
+ allow-foreign "true" | "false" (default) Pass non-Schematron elements to the generated stylesheet
+ sch.exslt.imports semi-colon delimited string of filenames for some EXSLT implementations
+ message-newline "true" (default) | "false" Generate an extra newline at the end of messages
+ debug "true" | "false" (default) Debug mode lets compilation continue despite problems
+ attributes "true" | "false" (Autodetecting) Use only when the schema has no attributes as the context nodes
+ only-child-elements "true" | "false" (Autodetecting) Use only when the schema has no comments
+ or PI as the context nodes
+ langCode ISO language code language for skeleton errors, if available
+ terminate= yes | no | true | false | assert Terminate on the first failed assertion or successful report
+ Note whether any output at all is generated depends on the XSLT implementation.
+
+ The following parameters can be specified as Schematron variables in diagnostics, assertions and so on.
+ fileNameParameter string
+ fileDirParameter string
+ archiveNameParameter string In case of ZIP files
+ archiveDirParameter string In case of ZIP files
+
+ Experimental: USE AT YOUR OWN RISK
+ visit-text "true" "false" Also visist text nodes for context. WARNING: NON_STARDARD.
+ select-contents '' | 'key' | '//' Select different implementation strategies
+
+ Conventions: Meta-stylesheets that override this may use the following parameters
+ generate-paths=true|false generate the @location attribute with XPaths
+ full-path-notation = 1|2|3 select the notation for the full paths: 1=computer, 2=human, 3=obsolescent
+ diagnose= yes | no Add the diagnostics to the assertion test in reports
+
+-->
+
+<!--
+ XSLT VERSION SUPPORT
+
+ XSLT 1:
+ A schema using the standard XSLT 1 query binding will have a /schema/@queryBinding='xslt' or
+ nothing.
+
+ * Note: XT does not implement key() and will die if given it.
+ * Add all formal parameters to default templates
+ * Fix missing apply-templates from process-ns and add params back
+
+ EXSLT: Experimental support
+ A schema using the EXSLT query binding will have a /schema/@queryBinding='exslt'.
+ It is built on XSLT 1. After experience is gained, this binding is expected to be
+ formalized as part of ISO Schematron, which currently reserves the "exslt" name for this purpose.
+
+ Some EXSLT engines have the extra functions built-in. For these, there is no need to
+ provide library locations. For engines that require the functions, either hard code
+ them in this script or provide them on the command-line argument.
+
+ XSLT 2: Experimental support
+ A schema using the XSLT 2 query binding will have a /schema/@queryBinding='xslt2'.
+ This binding is expected to be formalized as part of ISO
+ Schematron, which currently reserves the "xslt2" name for this purpose.
+ The xsl:import-schema, xsl:key and xsl:function elements are allowed as top elements.
+
+ XPATH: Experimental support
+ A schema using the XPATH query binding will have a /schema/@queryBinding='xpath'.
+ It can run with XSLT 1 and is a strict superset of default ISO Schematron. After
+ experience is gained, this binding is expected to be formalized as part of ISO
+ Schematron, which currently reserves the "xpath" name for this purpose.
+
+ The intent of this query binding is to support minimal non-XSLT implementations of
+ Schematron that use simple XPath APIs. These not only have fewer functions available
+ than the XSLT version of XPath, but some of them do not support variables.
+ Consequently, in this binding, the <let> element and command-line variables passed
+ to the schema should not be used?
+ The xsl:import-schema element is not allowed.
+
+-->
+<!--
+ PROCESS INFORMATION
+
+ This stylesheet compiles a Schematron schema (*.sch) into XSLT code (*.xsl).
+ The generated XSLT code can then be run against an XML file (*.xml, etc) and
+ will produce validation results.
+
+ The output of validation results is performed using named templates (process-*).
+ These can be overridden easily by making a new XSLT stylesheet that imports this
+ stylesheet but has its own version of the relevant process-* templates. Several
+ of these invoking stylesheets are available: "iso_svrl.xsl", for example generates
+ ISO Schematron Validation Report Language format results.
+
+ In this version of the stylesheet, the ISO feature called "abstract patterns" is
+ implemented using macro processing: a prior XSLT stage to which converts uses
+ of abstract patterns into normal patterns. If you do not use abstract patterns,
+ it is not necessary to preprocess the schema.
+
+ To summarize, a basic process flow for some commandline processor is like this:
+ XSLT -input=xxx.sch -output=xxx.xsl -stylesheet=iso_schematron_skeleton.xsl
+ XSLT -input=document.xml -output=xxx-document.results -stylesheet=xxx.xsl
+
+ iso_svrl.xslt is an implementation of Schematron that can use this skeleton and
+ generate ISO SVRL reports. A process flow for some commandline processor would
+ be like this:
+ XSLT -input=xxx.sch -output=xxx.xsl -stylesheet=iso_svrl.xsl
+ XSLT -input=document.xml -output=xxx-document.results -stylesheet=xxx.xsl
+
+ It is not impossible that ultimately a third stage, to handle macro-preprocessing
+ and inclusion, might be necessary. (The trade-off is in making this XSLT more
+ complex compared to making the outer process more complex.)
+
+ This version has been developed to work with
+ Saxon 9
+ For versions for XSLT 1 processors, see www.xml.com
+
+ Please note that if you are using SAXON and JAXP, then you should use
+ System.setProperty("javax.xml.transform.TransformerFactory",
+ "net.sf.saxon.TransformerFactoryImpl");
+ rather than
+ System.setProperty("javax.xml.xpath.TransformerFactory",
+ "net.sf.saxon.TransformerFactoryImpl");
+ which is does not work, at least for the versions of SAXON we tried.
+-->
+<!--
+ VERSION INFORMATION
+ 2010-04-14
+ * RJ Reorder call-template in exslt case only, report by BD
+ * Add command line parameter 'terminate' which will terminate on first failed
+ assert and (optionally) successful report.
+ 2010-01-24
+ * RJ Allow let elements to have direct content instead of @value
+ 2009-08020
+ * RJ Give better scoping to resolution of abstract rules
+ 2009-07-07
+ * RJ Fix up warning on looking for @* on root TODO CHECK!!!!
+ 2009-05-10
+ * RJ Fix up incorrect use of tunnel
+ 2009-02-25
+ * RJ Fix up variable names so none are used twice in same template
+ 2009-02-19
+ * RJ add experimental support for pattern/@documents
+ This takes an XPath that returns a sequence of strings, treats them as
+ relative URI references, and goes through these. It may need to be expanded
+ to allow absolute paths.
+ 2008-09-19 RJ
+ * Add mode schematron-select-full-path and param full-path-notation
+
+ 2008-08-19
+ * RJ Add experimental property element.
+ This acts like the diagnostics element. An attribute rule/@properties,
+ assert/@properties and report/@properties can contain a list of ids
+ which reference a /schema/proporties/property/@id. This is a property
+ which will be carried over to the output, eg SVRL. It can have @name,
+ and the value is @value or the contents. Properties on rules are
+ properties regardless of validation: they should apply to the subject
+ element. Properties on asserts and reports only make it through in the
+ negative case, at the moment, so they are really just a place to hold
+ structured info, eg. for diagnostics. The properties mechanism addresses
+ a bother with Schematron, that you have to post-process the document to
+ get any kind of structured data that might be nice in the output report.
+
+
+ 2008-08-14
+ * RJ move all messages into localization strings, add langCode parameter,
+ named template to call external file in same directory as this xslt.
+ The file should be called sch-message-$langCode.xhtml ($langCode example "en")
+
+ 2008-08-11
+ * TT report/@flag was missing
+ 2008-08-06
+ * TT Top-level lets need to be implemented using xsl:param not xsl:variable
+ * TT xsl:param/@select must have XPath or not be specified
+
+ 2008-08-04
+ * RJ add saxon namespace to output to allow extension functions
+ Version: 2008-07-28
+ * KH schematron-get-full-path-3 has [index] even on top step
+ Version: 2008-07-24
+ * RJ clean out commented out namespace handling code
+ * RJ allow schema/@queryBinding='xpath2' and warn if variables are
+ used
+
+ Version: 2008-07-14 update for XSLT2 and inclusion experiments
+ * RJ Clean up zero-length fragment test on include
+ * RJ Add experimental support for include containers
+ * RJ Add support for xsl:import-schema (request Paul Hermans)
+ * RJ Add support for xsl:function
+ * RJ For path generation, test for //iso:schema not just /iso:schema, for potential embedded Schematron support
+ * RJ Don't generate double error messages for old namespace elements
+ * RJ Experimental iso:rule/iso:title just kept as comment (bigger request Uche Ogbuji)
+ * RJ Fix bug that prevented including patterns in this (report Roger
+ Costello)
+ Version: 2007-10-17
+ Forked out version just to support SAXON 8 and potentially other XSLT2 processors.
+ * RJ use xsl:namespace element
+ * RJ use schold as namespace for old schematron, to prevent SAXON complaining
+ when validating the Schematron schema for Schematron
+ * RJ fix FULL-PATH for attributes
+
+ Version: 2007-07-19
+ Accept most changes in David Carlisle's fork, but continue as XSLT1 script:
+ http://dpcarlisle.blogspot.com/search/label/schematron
+ * DPC Remove "optimize" parameter
+ * DPC Add autodetecting optimize parameter attribute to skip checking attribute
+ context
+ * DPC Add autodetecting optimize parameter only-child-elements turn off checking for
+ comments and PIs
+ * DPC (Experimental: NON_STANDARD DANGER!) Add param visit-text to viist text
+ nodes too for context
+ * DPC Fix inclusion syntax to allow #
+ * DPC Priorities count up from 1000 not down from 4000 to allow more rules
+ * RJ Add new template for titles of schemas, with existing behaviour.
+ Override process-schema-title for custom processing of title
+
+
+ Version: 2007-04-04
+ * RJ debug mode param
+ * RJ alter mixed test to only test mixed branches, so the same document
+ could have old and new namespaces schemas in it, but each schema must
+ be distinct, just so as not to overconstrain things.
+ * KH zero-length include/@href is fatal error, but allow debug mode
+ * SB add hint on SAXON and JAXP
+ * DC generate-full-path-1 generates XLST1 code by default
+ Version: 2007-03-05
+ * AS Typo for EXSLT randome, improve comment
+ * KH get-schematron-full-path-2 needs to apply to attributes too
+ * DP document policy on extensions better
+ * DC use copy-of not copy for foreign elements
+ * DC add generate-path-2
+ * DC don't try to apply templates to attribute axis on attribute nodes, to
+ stop SAXON warning.
+ * RJ improve reporting of typos
+
+ Version: 2007-02-08
+ * KH Schematron fullpath implementation: @* handled twice and / missing
+ * KH Change stylesheetbody from named template to mode to allow implementers more flexibility.
+ Move process-ns to outside the stylesheet body.
+ * DP, FG, fix handling of xslt:key
+ * FG no iso:title/@class
+ * Experimental optimization 'visit-no-attributes'
+ * KH Experimental added schematron-get-full-path-2 which gives prefixed version for humans
+ * DC Move stylesheet/@version generation to after namespace handling
+ * DC, FG EXSLT namespace handling code
+ * FG add ref and commented code from FG's page on namespaces
+ * Start adding normalize-space() to parameter code
+ * Add a space between diagnostics
+
+ Version: 2007-01-22
+ * DP change = ($start) to = $start and =($phase) to =$phase
+ to run under Saxon 8.8j
+ * FG better title section using ( @id | iso:title)[last()]
+ * Default query language binding is "xslt" not "xslt1"
+
+ Version: 2007-01-19
+ * Simplify message newline code
+ * Remove termination and xpath appending to message options:
+ factor out as iso_schematron_terminator.xsl
+ * Comment out XSLT2 namespace fix temporarily
+
+ Version: 2007-01-18 (First beta candidate for comment)
+ * DC remove xml:space="preserve"
+ * FG improve comment on import statement
+ * DC improve comments on invocation section
+ * Add exploratory support for iso:schema[@queryBinding='xpath']
+ by allowing it and warning as lets are found
+ * Be strict about queryBinding spelling errors
+ * Extra comments on the different queryBindings
+ * KH Add option "message-paths" to generate XPath from output
+ * KH Add option "terminate" to halt with an error after the first assertion
+ * KH refactor paths in schematron-full-path
+ * Improve (?) namespace handling: no dummy attributes for prefix "xsl" generated
+
+ Version: 2007-01-15
+ * FG fix for calling templates
+ * Add formal parameters to default templates: may help XSLT 2
+ * Fix get-schematron-full-path
+ * Include skeleton1-6 is commented out by default
+
+ Version:2007-01-12 (Pre-beta release to Schematron-love-in maillist)
+ * Add many extra parameters to the process-* calls, so that almost
+ all the information in the schema can be provided to client programs.
+ Also, rearrange the parameters to fit in with the ISO schema, which
+ has "rich" and "linkable" attribute groups.
+ * Warn on diagnostics with no ID once only
+ * Improved path reporting, to handle for namespaces
+ * Add process-title dummy template for API
+ * Add command-line parameter allow-foreign (true|false) to suppress
+ warnings one foreign elements and pass them through to the generated
+ stylesheet
+ * remove legacy templates for the old ASCC namespace and no namespace,
+ and use an import statement instead. Much cleaner now!
+ * patterns use @id not @name
+ * titles can contain sub-elements
+ * start change iso:rule to allow attributes, PIs and comments
+ * the default process-* for inline elements add a leading and trailing
+ space, to reduce the chance of concatenation.
+ * add comments to make the generated code clearer
+
+ Version:2006-11-07 (ISO: first release private to schematron-love-in maillist for review)
+ * Duplicate pattern templates, for handling ISO namespace
+ * Add priority onto default and paragraph templates
+ * Add namespace checks
+ * Handle key in xsl namespace not iso
+ * Add include
+ * Improve namespace handling
+ * Preliminary XSLT2 and EXSLT support
+ * Refactor iso:schema for clarity
+
+ Version: 2003-05-26
+ * Fix bug with key
+ Version: 2003-04-16
+ * handle 1.6 let expressions
+ * make key use XSLT names, and allow anywhere
+ Version: 2001-06-13
+ * same skeleton now supports namespace or no namespace
+ * parameters to handlers updated for all 1.5 attributes
+ * diagnostic hints supported: command-line option diagnose=yes|no
+ * phases supported: command-line option phase=#ALL|...
+ * abstract rules
+ * compile-time error messages
+ * add utility routine generate-id-from-path
+
+ Contributors: Rick Jelliffe (original), Oliver Becker (architecture, XSLT2),
+ Miloslav Nic (diagnostic, phase, options), Ludwig Svenonius (abstract)
+ Uche Ogbuji (misc. bug fixes), Jim Ancona (SAXON workaround),
+ Francis Norton (generate-id-from-path), Robert Leftwich, Bryan Rasmussen,
+ Dave Pawson (include, fallback), Florent Georges (namespaces, exslt, attribute
+ context), Benoit Maisonny (attribute context), John Dumps (process-message newline),
+ Cliff Stanford (diagnostics and other newlines)
+
+
+
+
+ KNOWN TYPICAL LIMITATIONS:
+ * Don't use <iso:ns prefix="xsl" .../> with a namespace other than the standard
+ XSLT one. This would be a bizarre thing to do anyway.
+ * Don't use other prefixes for the XSLT namespace either; some implementations will
+ not handle it correctly.
+
+ EXTENSIONS:
+ ISO Schematron is designed as a framework with some standard query language
+ bindings. If you need to support other features, please do so safely by making
+ up your own @queryLanguage name: this makes it clear that your schema requires
+ special features. For example, default ISO Schematron does not support user
+ defined functions; so if you want to use the user defined function feature
+ in XSLT, you need to have a schema with some queryBinding attribute name like
+ "XSLT-with-my-functions" or whatever.
+-->
+
+
+
+
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias"
+ xmlns:schold="http://www.ascc.net/xml/schematron"
+ xmlns:iso="http://purl.oclc.org/dsdl/schematron"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ extension-element-prefixes="exsl"
+ version="2.0"
+ >
+<!-- This program implements ISO Schematron, except for abstract patterns
+which require a preprocess.
+-->
+
+
+<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>
+
+
+<!-- Category: top-level-element -->
+<xsl:output method="xml" omit-xml-declaration="no" standalone="yes" indent="yes"/>
+
+
+
+<xsl:param name="phase">
+ <xsl:choose>
+ <xsl:when test="//iso:schema/@defaultPhase">
+ <xsl:value-of select="//iso:schema/@defaultPhase"/>
+ </xsl:when>
+ <xsl:otherwise>#ALL</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:param name="allow-foreign">false</xsl:param>
+
+<xsl:param name="message-newline">true</xsl:param>
+
+<!-- DPC set to true if contexts should be checked on attribute nodes
+ defaults to true if there is any possibility that a context could match an attribute,
+ err on the side if caution, a context of *[.='@'] would cause this param to defualt to true
+ even though @ is in a string
+-->
+<xsl:param name="attributes">
+ <xsl:choose>
+ <xsl:when test="//iso:rule[contains(@context,'@') or contains(@context,'attribute')]">true</xsl:when>
+ <xsl:otherwise>false</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<!-- DPC set to true if contexts should be checked on just elements in the child axis
+ defaults to true if there is any possibility that a context could match an comment or PI
+ err on the side if caution, a context of *[.='('] would cause this param to defualt to true
+ even though ( is in a string, but node() comment() and processing-instruction() all have a (
+-->
+<xsl:param name="only-child-elements">
+ <xsl:choose>
+ <xsl:when test="//iso:rule[contains(@context,'(')]">true</xsl:when>
+ <xsl:otherwise>false</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<!-- DPC set to true if contexts should be checked on text nodes nodes (if only-child-elements is false)
+ THIS IS NON CONFORMANT BEHAVIOUR JUST FOR DISCUSSION OF A POSSIBLE CHANGE TO THE
+ SPECIFICATION. THIS PARAM SHOULD GO IF THE FINAL DECISION IS THAT THE SPEC DOES NOT CHANGE.
+ Always defaults to false
+-->
+<xsl:param name="visit-text" select="'false'"/>
+
+<!-- DPC
+ When selecting contexts the specified behaviour is
+ @*|node()[not(self::text())]
+ The automatic settings may use
+ node()[not(self::text())]
+ @*|*
+ *
+ instead for schema for which they are equivalent.
+ If the params are set explictly the above may be used, and also either if
+ @*
+ @*|node()
+ in all cases the result may not be equivalent, for example if you specify no attributes and the schema
+ does have attribute contexts they will be silently ignored.
+
+ after testing it turns out that
+ node()[not(self::text())] is slower in saxon than *|comment()|processing-instruction()
+ which I find a bit surprising but anyway I'll use the longr faster version.
+-->
+<xsl:variable name="context-xpath">
+ <xsl:if test="$attributes='true' and parent::node() ">@*|</xsl:if>
+ <xsl:choose>
+ <xsl:when test="$only-child-elements='true'">*</xsl:when>
+ <xsl:when test="$visit-text='true'">node()</xsl:when>
+ <xsl:otherwise>*|comment()|processing-instruction()</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<!-- DPC if this is set to
+ '' use recursive templates to iterate over document tree,
+ 'key' select all contexts with a key rather than walking the tree explictly in each mode
+ '//' select all contexts with // a key rather than walking the tree explictly in each mode (XSLT2 only)
+-->
+<xsl:param name="select-contexts" select="''"/>
+
+
+<!-- e.g. saxon file.xml file.xsl "sch.exslt.imports=.../string.xsl;.../math.xsl" -->
+<xsl:param name="sch.exslt.imports"/>
+
+<xsl:param name="debug">false</xsl:param>
+
+<!-- Set the language code for messages -->
+<xsl:param name="langCode">default</xsl:param>
+
+<!-- Set the default for schematron-select-full-path, i.e. the notation for svrl's @location-->
+<xsl:param name="full-path-notation">1</xsl:param>
+
+<xsl:param name="terminate">false</xsl:param>
+
+<!-- Simple namespace check -->
+<xsl:template match="/">
+ <xsl:if test="//schold:*[ancestor::iso:* or descendant::iso:*]">
+
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">1</xsl:with-param></xsl:call-template></xsl:message>
+
+ </xsl:if>
+
+ <xsl:apply-templates />
+</xsl:template>
+
+
+<!-- ============================================================== -->
+<!-- ISO SCHEMATRON SCHEMA ELEMENT -->
+<!-- Not handled: Abstract patterns. A pre-processor is assumed. -->
+<!-- ============================================================== -->
+
+<!-- SCHEMA -->
+<!-- Default uses XSLT 1 -->
+<xsl:template match="iso:schema[not(@queryBinding) or @queryBinding='xslt'
+ or @queryBinding='xslt1' or @queryBinding='XSLT' or @queryBinding='XSLT1'
+ or @queryBinding='xpath']">
+ <xsl:if test="
+ @queryBinding='xslt1' or @queryBinding='XSLT' or @queryBinding='XSLT1'">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">2</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <axsl:stylesheet>
+ <xsl:apply-templates
+ select="iso:ns" />
+
+ <!-- Handle the namespaces before the version attribute: reported to help SAXON -->
+ <xsl:attribute name="version">1.0</xsl:attribute>
+
+ <xsl:apply-templates select="." mode="stylesheetbody"/>
+ <!-- was xsl:call-template name="stylesheetbody"/ -->
+ </axsl:stylesheet>
+</xsl:template>
+
+<!-- Using EXSLT with all modeles (except function module: not applicable) -->
+<xsl:template match="iso:schema[@queryBinding='exslt']" priority="10">
+ <xsl:comment>This XSLT was automatically generated from a Schematron schema.</xsl:comment>
+ <axsl:stylesheet
+ xmlns:date="http://exslt.org/dates-and-times"
+ xmlns:dyn="http://exslt.org/dynamic"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:math="http://exslt.org/math"
+ xmlns:random="http://exslt.org/random"
+ xmlns:regexp="http://exslt.org/regular-expressions"
+ xmlns:set="http://exslt.org/sets"
+ xmlns:str="http://exslt.org/strings"
+ extension-element-prefixes="date dyn exsl math random regexp set str" >
+
+ <xsl:apply-templates
+ select="iso:ns" />
+ <!-- Handle the namespaces before the version attribute: reported to help SAXON -->
+ <xsl:attribute name="version">1.0</xsl:attribute>
+
+ <xsl:apply-templates select="." mode="stylesheetbody"/>
+ <!-- was xsl:call-template name="stylesheetbody"/ -->
+ </axsl:stylesheet>
+</xsl:template>
+
+<!-- Using XSLT 2 -->
+<xsl:template
+ match="iso:schema[@queryBinding='xslt2' or @queryBinding ='xpath2']"
+ priority="10">
+ <axsl:stylesheet
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:saxon="http://saxon.sf.net/"
+ >
+ <xsl:apply-templates
+ select="iso:ns" />
+ <!-- Handle the namespaces before the version attribute: reported to help SAXON -->
+ <xsl:attribute name="version">2.0</xsl:attribute>
+
+ <xsl:apply-templates select="." mode="stylesheetbody"/>
+ <!-- was xsl:call-template name="stylesheetbody"/ -->
+ </axsl:stylesheet>
+</xsl:template>
+
+
+<!-- Uses unknown query language binding -->
+<xsl:template match="iso:schema" priority="-1">
+ <xsl:message terminate="yes" ><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">3a</xsl:with-param></xsl:call-template>
+ <xsl:value-of select="@queryBinding"/>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">3b</xsl:with-param></xsl:call-template></xsl:message>
+</xsl:template>
+
+<xsl:template match="*" mode="stylesheetbody">
+ <!--xsl:template name="stylesheetbody"-->
+ <xsl:comment>Implementers: please note that overriding process-prolog or process-root is
+ the preferred method for meta-stylesheets to use where possible. </xsl:comment><xsl:text> </xsl:text>
+
+ <!-- These parameters may contain strings with the name and directory of the file being
+ validated. For convenience, if the caller only has the information in a single string,
+ that string could be put in fileDirParameter. The archives parameters are available
+ for ZIP archives.
+ -->
+
+ <xsl:call-template name="iso:exslt.add.imports" /> <!-- RJ moved report BH -->
+ <axsl:param name="archiveDirParameter" />
+ <axsl:param name="archiveNameParameter" />
+ <axsl:param name="fileNameParameter" />
+ <axsl:param name="fileDirParameter" />
+
+
+ <axsl:variable name="document-uri"><axsl:value-of select="document-uri(/)" /></axsl:variable>
+ <xsl:text> </xsl:text><xsl:comment>PHASES</xsl:comment><xsl:text> </xsl:text>
+ <xsl:call-template name="handle-phase"/>
+ <xsl:text> </xsl:text><xsl:comment>PROLOG</xsl:comment><xsl:text> </xsl:text>
+ <xsl:call-template name="process-prolog"/>
+ <xsl:text> </xsl:text><xsl:comment>XSD TYPES FOR XSLT2</xsl:comment><xsl:text> </xsl:text>
+ <xsl:apply-templates mode="do-types" select="xsl:import-schema"/>
+ <xsl:text> </xsl:text><xsl:comment>KEYS AND FUNCTIONS</xsl:comment><xsl:text> </xsl:text>
+ <xsl:apply-templates mode="do-keys" select="xsl:key | xsl:function "/>
+ <xsl:text> </xsl:text><xsl:comment>DEFAULT RULES</xsl:comment><xsl:text> </xsl:text>
+ <xsl:call-template name="generate-default-rules" />
+ <xsl:text> </xsl:text><xsl:comment>SCHEMA SETUP</xsl:comment><xsl:text> </xsl:text>
+ <xsl:call-template name="handle-root"/>
+ <xsl:text> </xsl:text><xsl:comment>SCHEMATRON PATTERNS</xsl:comment><xsl:text> </xsl:text>
+
+ <xsl:apply-templates select="*[not(self::iso:ns)] " />
+</xsl:template>
+
+ <xsl:template name="iso:exslt.add.imports">
+ <xsl:param name="imports" select="$sch.exslt.imports"/>
+ <xsl:choose>
+ <xsl:when test="contains($imports, ';')">
+ <axsl:import href="{ substring-before($imports, ';') }"/>
+ <xsl:call-template name="iso:exslt.add.imports">
+ <xsl:with-param name="imports" select="substring-after($imports, ';')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$imports">
+ <axsl:import href="{ $imports }"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+<xsl:template name="handle-phase" >
+ <!-- This just tests that the phase exists -->
+ <xsl:if test="not(normalize-space( $phase ) = '#ALL')">
+ <xsl:if test="not(iso:phase[@id = normalize-space( $phase )])">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">4a</xsl:with-param></xsl:call-template>
+ <xsl:value-of select="normalize-space( $phase )"/>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">4b</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate-default-rules">
+ <xsl:text> </xsl:text>
+ <xsl:comment>MODE: SCHEMATRON-SELECT-FULL-PATH</xsl:comment><xsl:text> </xsl:text>
+ <xsl:comment>This mode can be used to generate an ugly though full XPath for locators</xsl:comment><xsl:text> </xsl:text>
+ <axsl:template match="*" mode="schematron-select-full-path">
+ <xsl:choose>
+ <xsl:when test=" $full-path-notation = '1' ">
+ <!-- Use for computers, but rather unreadable for humans -->
+ <axsl:apply-templates select="." mode="schematron-get-full-path"/>
+ </xsl:when>
+ <xsl:when test=" $full-path-notation = '2' ">
+ <!-- Use for humans, but no good for paths unless namespaces are known out-of-band -->
+ <axsl:apply-templates select="." mode="schematron-get-full-path-2"/>
+ </xsl:when>
+ <xsl:when test=" $full-path-notation = '3' ">
+ <!-- Obsolescent. Use for humans, but no good for paths unless namespaces are known out-of-band -->
+ <axsl:apply-templates select="." mode="schematron-get-full-path-3"/>
+ </xsl:when>
+
+ <xsl:otherwise >
+ <!-- Use for computers, but rather unreadable for humans -->
+ <axsl:apply-templates select="." mode="schematron-get-full-path"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </axsl:template>
+
+
+ <xsl:text> </xsl:text>
+ <xsl:comment>MODE: SCHEMATRON-FULL-PATH</xsl:comment><xsl:text> </xsl:text>
+ <xsl:comment>This mode can be used to generate an ugly though full XPath for locators</xsl:comment><xsl:text> </xsl:text>
+ <axsl:template match="*" mode="schematron-get-full-path">
+ <axsl:apply-templates select="parent::*" mode="schematron-get-full-path"/>
+ <xsl:choose>
+ <xsl:when test="//iso:schema[@queryBinding='xslt2']">
+ <!-- XSLT2 syntax -->
+ <axsl:text>/</axsl:text>
+ <axsl:choose>
+ <axsl:when test="namespace-uri()=''"><axsl:value-of select="name()"/></axsl:when>
+ <axsl:otherwise>
+ <axsl:text>*:</axsl:text>
+ <axsl:value-of select="local-name()"/>
+ <axsl:text>[namespace-uri()='</axsl:text>
+ <axsl:value-of select="namespace-uri()"/>
+ <axsl:text>']</axsl:text>
+ </axsl:otherwise>
+ </axsl:choose>
+ <axsl:variable name="preceding" select=
+ "count(preceding-sibling::*[local-name()=local-name(current())
+ and namespace-uri() = namespace-uri(current())])" />
+ <axsl:text>[</axsl:text>
+ <axsl:value-of select="1+ $preceding"/>
+ <axsl:text>]</axsl:text>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- XSLT1 syntax -->
+
+ <axsl:text>/</axsl:text>
+ <axsl:choose>
+ <axsl:when test="namespace-uri()=''">
+ <axsl:value-of select="name()"/>
+ <axsl:variable name="p_1" select="1+
+ count(preceding-sibling::*[name()=name(current())])" />
+ <axsl:if test="$p_1>1 or following-sibling::*[name()=name(current())]">
+ <xsl:text/>[<axsl:value-of select="$p_1"/>]<xsl:text/>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:text>*[local-name()='</axsl:text>
+ <axsl:value-of select="local-name()"/>
+ <axsl:text>']</axsl:text>
+ <axsl:variable name="p_2" select="1+
+ count(preceding-sibling::*[local-name()=local-name(current())])" />
+ <axsl:if test="$p_2>1 or following-sibling::*[local-name()=local-name(current())]">
+ <xsl:text/>[<axsl:value-of select="$p_2"/>]<xsl:text/>
+ </axsl:if>
+ </axsl:otherwise>
+ </axsl:choose>
+ </xsl:otherwise>
+
+ </xsl:choose>
+ </axsl:template>
+
+
+ <axsl:template match="@*" mode="schematron-get-full-path">
+ <xsl:choose>
+ <xsl:when test="//iso:schema[@queryBinding='xslt2']">
+ <!-- XSLT2 syntax -->
+ <axsl:apply-templates select="parent::*" mode="schematron-get-full-path"/>
+ <axsl:text>/</axsl:text>
+ <axsl:choose>
+ <axsl:when test="namespace-uri()=''">@<axsl:value-of select="name()"/></axsl:when>
+ <axsl:otherwise>
+ <axsl:text>@*[local-name()='</axsl:text>
+ <axsl:value-of select="local-name()"/>
+ <axsl:text>' and namespace-uri()='</axsl:text>
+ <axsl:value-of select="namespace-uri()"/>
+ <axsl:text>']</axsl:text>
+ </axsl:otherwise>
+ </axsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- XSLT1 syntax -->
+ <axsl:text>/</axsl:text>
+ <axsl:choose>
+ <axsl:when test="namespace-uri()=''">@<axsl:value-of
+ select="name()"/></axsl:when>
+ <axsl:otherwise>
+ <axsl:text>@*[local-name()='</axsl:text>
+ <axsl:value-of select="local-name()"/>
+ <axsl:text>' and namespace-uri()='</axsl:text>
+ <axsl:value-of select="namespace-uri()"/>
+ <axsl:text>']</axsl:text>
+ </axsl:otherwise>
+ </axsl:choose>
+
+ </xsl:otherwise>
+ </xsl:choose>
+ </axsl:template>
+
+ <xsl:text> </xsl:text>
+
+ <xsl:comment>MODE: SCHEMATRON-FULL-PATH-2</xsl:comment>
+ <xsl:text> </xsl:text>
+ <xsl:comment>This mode can be used to generate prefixed XPath for humans</xsl:comment>
+ <xsl:text> </xsl:text>
+ <!--simplify the error messages by using the namespace prefixes of the
+ instance rather than the generic namespace-uri-styled qualification-->
+ <axsl:template match="node() | @*" mode="schematron-get-full-path-2">
+ <!--report the element hierarchy-->
+ <axsl:for-each select="ancestor-or-self::*">
+ <axsl:text>/</axsl:text>
+ <axsl:value-of select="name(.)"/>
+ <axsl:if test="preceding-sibling::*[name(.)=name(current())]">
+ <axsl:text>[</axsl:text>
+ <axsl:value-of
+ select="count(preceding-sibling::*[name(.)=name(current())])+1"/>
+ <axsl:text>]</axsl:text>
+ </axsl:if>
+ </axsl:for-each>
+ <!--report the attribute-->
+ <axsl:if test="not(self::*)">
+ <axsl:text/>/@<axsl:value-of select="name(.)"/>
+ </axsl:if>
+ </axsl:template>
+
+
+ <xsl:comment>MODE: SCHEMATRON-FULL-PATH-3</xsl:comment>
+
+ <xsl:text> </xsl:text>
+ <xsl:comment>This mode can be used to generate prefixed XPath for humans
+ (Top-level element has index)</xsl:comment>
+ <xsl:text> </xsl:text>
+ <!--simplify the error messages by using the namespace prefixes of the
+ instance rather than the generic namespace-uri-styled qualification-->
+ <axsl:template match="node() | @*" mode="schematron-get-full-path-3">
+ <!--report the element hierarchy-->
+ <axsl:for-each select="ancestor-or-self::*">
+ <axsl:text>/</axsl:text>
+ <axsl:value-of select="name(.)"/>
+ <axsl:if test="parent::*">
+ <axsl:text>[</axsl:text>
+ <axsl:value-of
+ select="count(preceding-sibling::*[name(.)=name(current())])+1"/>
+ <axsl:text>]</axsl:text>
+ </axsl:if>
+ </axsl:for-each>
+ <!--report the attribute-->
+ <axsl:if test="not(self::*)">
+ <axsl:text/>/@<axsl:value-of select="name(.)"/>
+ </axsl:if>
+ </axsl:template>
+
+ <xsl:text> </xsl:text>
+ <xsl:comment>MODE: GENERATE-ID-FROM-PATH </xsl:comment><xsl:text> </xsl:text>
+ <!-- repeatable-id maker derived from Francis Norton's. -->
+ <!-- use this if you need generate ids in separate passes,
+ because generate-id() is not guaranteed to produce the same
+ results each time. These ids are not XML names but closer to paths. -->
+ <axsl:template match="/" mode="generate-id-from-path"/>
+ <axsl:template match="text()" mode="generate-id-from-path">
+ <axsl:apply-templates select="parent::*" mode="generate-id-from-path"/>
+ <axsl:value-of select="concat('.text-', 1+count(preceding-sibling::text()), '-')"/>
+ </axsl:template>
+ <axsl:template match="comment()" mode="generate-id-from-path">
+ <axsl:apply-templates select="parent::*" mode="generate-id-from-path"/>
+ <axsl:value-of select="concat('.comment-', 1+count(preceding-sibling::comment()), '-')"/>
+ </axsl:template>
+ <axsl:template match="processing-instruction()" mode="generate-id-from-path">
+ <axsl:apply-templates select="parent::*" mode="generate-id-from-path"/>
+ <axsl:value-of
+ select="concat('.processing-instruction-', 1+count(preceding-sibling::processing-instruction()), '-')"/>
+ </axsl:template>
+ <axsl:template match="@*" mode="generate-id-from-path">
+ <axsl:apply-templates select="parent::*" mode="generate-id-from-path"/>
+ <axsl:value-of select="concat('.@', name())"/>
+ </axsl:template>
+ <axsl:template match="*" mode="generate-id-from-path" priority="-0.5">
+ <axsl:apply-templates select="parent::*" mode="generate-id-from-path"/>
+ <axsl:text>.</axsl:text>
+<!--
+ <axsl:choose>
+ <axsl:when test="count(. | ../namespace::*) = count(../namespace::*)">
+ <axsl:value-of select="concat('.namespace::-',1+count(namespace::*),'-')"/>
+ </axsl:when>
+ <axsl:otherwise>
+-->
+ <axsl:value-of
+ select="concat('.',name(),'-',1+count(preceding-sibling::*[name()=name(current())]),'-')"/>
+<!--
+ </axsl:otherwise>
+ </axsl:choose>
+-->
+ </axsl:template>
+
+
+ <xsl:text> </xsl:text>
+ <xsl:comment>MODE: GENERATE-ID-2 </xsl:comment><xsl:text> </xsl:text>
+ <!-- repeatable-id maker from David Carlisle. -->
+ <!-- use this if you need generate IDs in separate passes,
+ because generate-id() is not guaranteed to produce the same
+ results each time. These IDs are well-formed XML NMTOKENS -->
+ <axsl:template match="/" mode="generate-id-2">U</axsl:template>
+
+ <axsl:template match="*" mode="generate-id-2" priority="2">
+ <axsl:text>U</axsl:text>
+ <axsl:number level="multiple" count="*"/>
+ </axsl:template>
+
+ <axsl:template match="node()" mode="generate-id-2">
+ <axsl:text>U.</axsl:text>
+ <axsl:number level="multiple" count="*"/>
+ <axsl:text>n</axsl:text>
+ <axsl:number count="node()"/>
+ </axsl:template>
+
+ <axsl:template match="@*" mode="generate-id-2">
+ <axsl:text>U.</axsl:text>
+ <axsl:number level="multiple" count="*"/>
+ <axsl:text>_</axsl:text>
+ <axsl:value-of select="string-length(local-name(.))"/>
+ <axsl:text>_</axsl:text>
+ <axsl:value-of select="translate(name(),':','.')"/>
+ </axsl:template>
+
+
+ <xsl:comment>Strip characters</xsl:comment>
+ <axsl:template match="text()" priority="-1" />
+
+ </xsl:template>
+
+ <xsl:template name="handle-root">
+ <!-- Process the top-level element -->
+ <axsl:template match="/">
+ <xsl:call-template name="process-root">
+ <xsl:with-param
+ name="title" select="(@id | iso:title)[last()]"/>
+ <xsl:with-param name="version" select="'iso'" />
+ <xsl:with-param name="schemaVersion" select="@schemaVersion" />
+ <xsl:with-param name="queryBinding" select="@queryBinding" />
+ <xsl:with-param name="contents">
+ <xsl:apply-templates mode="do-all-patterns"/>
+ </xsl:with-param>
+
+ <!-- "Rich" properties -->
+ <xsl:with-param name="fpi" select="@fpi"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ <xsl:with-param name="see" select="@see" />
+ <xsl:with-param name="space" select="@xml:space" />
+ </xsl:call-template>
+ </axsl:template>
+
+
+</xsl:template>
+
+<!-- ============================================================== -->
+<!-- ISO SCHEMATRON ELEMENTS -->
+<!-- ============================================================== -->
+
+ <!-- ISO ACTIVE -->
+ <xsl:template match="iso:active">
+ <xsl:if test="not(@pattern)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">5</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not(../../iso:pattern[@id = current()/@pattern])
+ and not(../../iso:include)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">6a</xsl:with-param></xsl:call-template>
+ <xsl:value-of select="@pattern"/>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">6b</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- ISO ASSERT and REPORT -->
+ <xsl:template match="iso:assert">
+
+ <xsl:if test="not(@test)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">7</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <xsl:comment>ASSERT <xsl:value-of select="@role" /> </xsl:comment><xsl:text> </xsl:text>
+
+ <axsl:choose>
+ <axsl:when test="{@test}"/>
+ <axsl:otherwise>
+ <xsl:call-template name="process-assert">
+ <xsl:with-param name="test" select="normalize-space(@test)" />
+ <xsl:with-param name="diagnostics" select="@diagnostics"/>
+ <xsl:with-param name="flag" select="@flag"/>
+
+ <xsl:with-param name="properties" select="@properties" />
+
+ <!-- "Rich" properties -->
+ <xsl:with-param name="fpi" select="@fpi"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ <xsl:with-param name="see" select="@see" />
+ <xsl:with-param name="space" select="@xml:space" />
+
+ <!-- "Linking" properties -->
+ <xsl:with-param name="role" select="@role" />
+ <xsl:with-param name="subject" select="@subject" />
+
+ </xsl:call-template>
+
+
+ </axsl:otherwise>
+ </axsl:choose>
+ </xsl:template>
+ <xsl:template match="iso:report">
+
+ <xsl:if test="not(@test)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">8</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+
+ <xsl:text> </xsl:text>
+ <xsl:comment>REPORT <xsl:value-of select="@role" /> </xsl:comment><xsl:text> </xsl:text>
+
+ <axsl:if test="{@test}">
+
+ <xsl:call-template name="process-report">
+ <xsl:with-param name="test" select="normalize-space(@test)" />
+ <xsl:with-param name="diagnostics" select="@diagnostics"/>
+ <xsl:with-param name="flag" select="@flag"/>
+
+ <xsl:with-param name="properties" select="@properties" />
+ <!-- "Rich" properties -->
+ <xsl:with-param name="fpi" select="@fpi"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ <xsl:with-param name="see" select="@see" />
+ <xsl:with-param name="space" select="@xml:space" />
+
+ <!-- "Linking" properties -->
+ <xsl:with-param name="role" select="@role" />
+ <xsl:with-param name="subject" select="@subject" />
+ </xsl:call-template>
+
+ </axsl:if>
+ </xsl:template>
+
+
+ <!-- ISO DIAGNOSTIC -->
+ <!-- We use a mode here to maintain backwards compatability, instead of adding it
+ to the other mode.
+ -->
+ <xsl:template match="iso:diagnostic" mode="check-diagnostics">
+ <xsl:if test="not(@id)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">9</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="iso:diagnostic" >
+ <xsl:call-template name="process-diagnostic">
+
+ <!-- "Rich" properties -->
+ <xsl:with-param name="fpi" select="@fpi"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ <xsl:with-param name="see" select="@see" />
+ <xsl:with-param name="space" select="@xml:space" />
+ </xsl:call-template>
+
+ </xsl:template>
+
+ <!-- ISO DIAGNOSTICS -->
+ <xsl:template match="iso:diagnostics" >
+ <xsl:apply-templates mode="check-diagnostics" select="*" />
+ </xsl:template>
+
+ <!-- ISO DIR -->
+ <xsl:template match="iso:dir" mode="text" >
+ <xsl:call-template name="process-dir">
+ <xsl:with-param name="value" select="@value"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- ISO EMPH -->
+ <xsl:template match="iso:emph" mode="text">
+
+ <xsl:call-template name="process-emph"/>
+
+ </xsl:template>
+
+ <!-- ISO EXTENDS -->
+ <xsl:template match="iso:extends">
+ <xsl:if test="not(@rule)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">10</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:if test="not(//iso:rule[@abstract='true'][@id= current()/@rule] )">
+ <xsl:message>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">11a</xsl:with-param></xsl:call-template>
+ <xsl:value-of select="@rule"/>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">11b</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:call-template name="IamEmpty" />
+
+ <xsl:choose>
+ <!-- prefer to use a locally declared rule -->
+ <xsl:when test="parent::*/parent::*/iso:rule[@id=current()/@rule]">
+ <xsl:apply-templates select="parent::*/parent::*/iso:rule[@id=current()/@rule]"
+ mode="extends"/>
+ </xsl:when>
+ <!-- otherwise use a global one: this is not in the 2006 standard -->
+ <xsl:when test="//iso:rule[@id=current()/@rule]">
+ <xsl:apply-templates select="//iso:rule[@id=current()/@rule]"
+ mode="extends"/>
+ </xsl:when>
+ </xsl:choose>
+
+
+ </xsl:template>
+
+ <!-- KEY: ISO has no KEY -->
+ <!-- NOTE:
+ Key has had a checkered history. Schematron 1.0 allowed it in certain places, but
+ users came up with a different location, which has now been adopted.
+
+ XT, the early XSLT processor, did not implement key and died when it was present.
+ So there are some versions of the Schematron skeleton for XT that strip out all
+ key elements.
+
+ Xalan (e.g. Xalan4C 1.0 and a Xalan4J) also had a funny. A fix involved making
+ a top-level parameter called $hiddenKey and then using that instead of matching
+ "key". This has been removed.
+
+ Keys and functions are the same mode, to allow their declaration to be mixed up.
+ -->
+ <xsl:template match="xsl:key" mode="do-keys" >
+ <xsl:if test="not(@name)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">12</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:if test="not(@path) and not(@use)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">13</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="parent::iso:rule ">
+ <xsl:call-template name="IamEmpty" />
+ <xsl:choose>
+ <xsl:when test="@path">
+ <axsl:key match="{../@context}" name="{@name}" use="{@path}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <axsl:key match="{../@context}" name="{@name}" use="{@use}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="not(@match) ">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">14</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <axsl:key>
+ <xsl:copy-of select="@*"/>
+ </axsl:key>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="xsl:key " /><!-- swallow -->
+
+ <xsl:template match="iso:key " >
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">15</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:template>
+
+ <!-- XSL FUNCTION -->
+ <xsl:template match="xsl:function" mode="do-keys" >
+ <xsl:if test="not(@name)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">16</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:copy-of select="."/>
+ </xsl:template>
+
+ <xsl:template match="xsl:function " /><!-- swallow -->
+
+ <xsl:template match="iso:function " >
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">17</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:template>
+
+
+ <!-- ISO INCLUDE -->
+ <!-- This is only a fallback. Include really needs to have been done before this as a separate pass.-->
+
+ <xsl:template match="iso:include[not(normalize-space(@href))]"
+ priority="1">
+ <xsl:if test=" $debug = 'false' ">
+ <xsl:message terminate="yes"><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">18</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+
+ </xsl:template>
+
+ <!-- Extend the URI syntax to allow # refererences -->
+ <!-- Note that XSLT2 actually already allows # references, but we override them because it
+ looks unreliable -->
+ <xsl:template match="iso:include">
+ <xsl:variable name="document-uri" select="substring-before(concat(@href,'#'), '#')"/>
+ <xsl:variable name="fragment-id" select="substring-after(@href, '#')"/>
+
+ <xsl:choose>
+
+ <xsl:when test="string-length( $document-uri ) = 0 and string-length( $fragment-id ) = 0" >
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">19</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:when>
+
+ <xsl:when test="string-length( $fragment-id ) > 0">
+ <xsl:variable name="theDocument_1" select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_1" select="$theDocument_1//iso:*[@id= $fragment-id]" />
+ <xsl:if test="not($theDocument_1)">
+ <xsl:message terminate="no">
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">20a</xsl:with-param></xsl:call-template>
+ <xsl:value-of select="@href"/>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">20b</xsl:with-param></xsl:call-template>
+ </xsl:message>
+ </xsl:if>
+ <xsl:if test=" $theFragment_1/self::iso:schema ">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">21</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select=" $theFragment_1"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- Import the top-level element if it is in schematron namespace,
+ or its children otherwise, to allow a simple containment mechanism. -->
+ <xsl:variable name="theDocument_2" select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_2" select="$theDocument_2/iso:*" />
+ <xsl:variable name="theContainedFragments" select="$theDocument_2/*/iso:*" />
+ <xsl:if test="not($theDocument_2)">
+ <xsl:message terminate="no">
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">20a</xsl:with-param></xsl:call-template>
+ <xsl:value-of select="@href"/>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">20b</xsl:with-param></xsl:call-template>
+ </xsl:message>
+ </xsl:if>
+ <xsl:if test=" $theFragment_2/self::iso:schema or $theContainedFragments/self::iso:schema">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">21</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select="$theFragment_2 | $theContainedFragments "/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- This is to handle the particular case of including patterns -->
+ <xsl:template match="iso:include" mode="do-all-patterns">
+ <xsl:variable name="document-uri" select="substring-before(concat(@href,'#'), '#')"/>
+ <xsl:variable name="fragment-id" select="substring-after(@href, '#')"/>
+
+ <xsl:choose>
+
+ <xsl:when test="string-length( $document-uri ) = 0 and string-length( $fragment-id ) = 0" >
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">19</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:when>
+
+ <xsl:when test="string-length( $fragment-id ) > 0">
+ <xsl:variable name="theDocument_1" select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_1" select="$theDocument_1//iso:*[@id= $fragment-id ]" />
+ <xsl:if test=" $theFragment_1/self::iso:schema ">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">21</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select=" $theFragment_1" mode="do-all-patterns"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- Import the top-level element if it is in schematron namespace,
+ or its children otherwise, to allow a simple containment mechanism. -->
+ <xsl:variable name="theDocument_2" select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_2" select="$theDocument_2/iso:*" />
+ <xsl:variable name="theContainedFragments" select="$theDocument_2/*/iso:*" />
+ <xsl:if test=" $theFragment_2/self::iso:schema or $theContainedFragments/self::iso:schema">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">21</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select="$theFragment_2 | $theContainedFragments "
+ mode="do-all-patterns" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- XSL IMPORT-SCHEMA -->
+ <!-- Importing an XSD schema allows the variour type operations to be available. -->
+ <xsl:template match="xsl:import-schema" mode="do-types" >
+ <xsl:choose>
+ <xsl:when test="ancestor::iso:schema[@queryBinding='xslt2']">
+ <xsl:copy-of select="." />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">22</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- swallow -->
+ <xsl:template match="xsl:import-schema" />
+
+ <xsl:template match="iso:import-schema " >
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">23</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:template>
+
+ <!-- ISO LET -->
+ <xsl:template match="iso:let" >
+ <xsl:if test="ancestor::iso:schema[@queryBinding='xpath']">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">24</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:if test="ancestor::iso:schema[@queryBinding='xpath2']">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">25</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+
+ <!-- lets at the top-level are implemented as parameters unless they have contents -->
+ <xsl:choose>
+ <xsl:when test="parent::iso:schema">
+ <!-- it is an error to have an empty param/@select because an XPath is expected -->
+ <xsl:choose>
+ <xsl:when test="@value">
+ <axsl:param name="{@name}" select="{@value}">
+ <xsl:if test="string-length(@value) > 0">
+ <xsl:attribute name="select"><xsl:value-of select="@value"/></xsl:attribute>
+ </xsl:if>
+ </axsl:param>
+ </xsl:when>
+ <xsl:otherwise>
+ <axsl:variable name="{@name}" >
+ <xsl:copy-of select="child::node()" />
+ </axsl:variable>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+
+ <xsl:choose>
+ <xsl:when test="@value">
+ <axsl:variable name="{@name}" select="{@value}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <axsl:variable name="{@name}" >
+ <xsl:copy-of select="child::node()" />
+ </axsl:variable>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ISO NAME -->
+ <xsl:template match="iso:name" mode="text">
+
+ <xsl:if test="@path">
+ <xsl:call-template name="process-name">
+ <xsl:with-param name="name" select="concat('name(',@path,')')"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="not(@path)">
+ <xsl:call-template name="process-name">
+ <xsl:with-param name="name" select="'name(.)'"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:call-template name="IamEmpty" />
+ </xsl:template>
+
+ <!-- ISO NS -->
+ <!-- Namespace handling is XSLT is quite tricky and implementation dependent -->
+ <xsl:template match="iso:ns">
+ <xsl:call-template name="handle-namespace" />
+ </xsl:template>
+
+ <!-- This template is just to provide the API hook -->
+ <xsl:template match="iso:ns" mode="do-all-patterns" >
+ <xsl:if test="not(@uri)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">26</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:if test="not(@prefix)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">27</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:call-template name="IamEmpty" />
+ <xsl:call-template name="process-ns" >
+ <xsl:with-param name="prefix" select="@prefix"/>
+ <xsl:with-param name="uri" select="@uri"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- ISO P -->
+ <xsl:template match="iso:schema/iso:p " mode="do-schema-p" >
+ <xsl:call-template name="process-p">
+ <xsl:with-param name="class" select="@class"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template match="iso:pattern/iso:p " mode="do-pattern-p" >
+ <xsl:call-template name="process-p">
+ <xsl:with-param name="class" select="@class"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- Currently, iso:p in other position are not passed through to the API -->
+ <xsl:template match="iso:phase/iso:p" />
+ <xsl:template match="iso:p " priority="-1" />
+
+ <!-- ISO PATTERN -->
+ <xsl:template match="iso:pattern" mode="do-all-patterns">
+ <xsl:if test="($phase = '#ALL')
+ or (../iso:phase[@id= $phase]/iso:active[@pattern= current()/@id])">
+
+ <!-- Extension to allow validation in multiple documents -->
+ <xsl:choose>
+ <xsl:when test="string-length(normalize-space(@documents))=0" >
+ <xsl:call-template name="handle-pattern" />
+ </xsl:when>
+ <xsl:otherwise>
+ <axsl:variable name="thePath"
+ select="{@documents}"
+ as="xs:string*" />
+
+ <axsl:for-each select="$thePath">
+ <axsl:choose>
+ <axsl:when test="starts-with( ., 'http:') or starts-with(., 'file:' )
+ or starts-with(., '/')"><!-- try as absolute path -->
+ <axsl:for-each select="document(.)">
+ <xsl:call-template name="handle-pattern" />
+ </axsl:for-each>
+ </axsl:when>
+ <axsl:otherwise><!-- is relative path -->
+ <axsl:for-each select="document(concat( $document-uri , '/../', .))">
+ <xsl:call-template name="handle-pattern" />
+ </axsl:for-each>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ </xsl:template>
+
+ <xsl:template name="handle-pattern">
+ <xsl:call-template name="process-pattern">
+ <!-- the following select statement assumes that
+ @id | iso:title returns node-set in document order:
+ we want the title if it is there, otherwise the @id attribute -->
+ <xsl:with-param name="name" select="(@id | iso:title )[last()]"/>
+ <xsl:with-param name="is-a" select="''"/>
+
+ <!-- "Rich" properties -->
+ <xsl:with-param name="fpi" select="@fpi"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ <xsl:with-param name="see" select="@see" />
+ <xsl:with-param name="space" select="@xml:space" />
+ </xsl:call-template>
+ <xsl:choose>
+ <!-- Use the key method -->
+ <xsl:when test="$select-contexts='key'">
+ <axsl:apply-templates select="key('M','M{count(preceding-sibling::*)}')" mode="M{count(preceding-sibling::*)}"/>
+ </xsl:when>
+
+ <!-- Use the // method -->
+ <xsl:when test="$select-contexts='//'">
+ <xsl:choose>
+ <xsl:when test="@document">
+ <!-- External document -->
+ <axsl:for-each select="{@document}">
+ <!-- same code as next block, but run from different context -->
+ <axsl:apply-templates mode="M{count(preceding-sibling::*)}" >
+ <xsl:attribute name="select">
+ <xsl:text>//(</xsl:text>
+ <xsl:for-each select="iso:rule/@context">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="position()!=last()">|</xsl:if>
+ </xsl:for-each>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="$visit-text='false'">[not(self::text())]</xsl:if>
+ </xsl:attribute>
+ </axsl:apply-templates>
+ </axsl:for-each>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <axsl:apply-templates mode="M{count(preceding-sibling::*)}" >
+ <xsl:attribute name="select">
+ <xsl:text>//(</xsl:text>
+ <xsl:for-each select="iso:rule/@context">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="position()!=last()">|</xsl:if>
+ </xsl:for-each>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="$visit-text='false'">[not(self::text())]</xsl:if>
+ </xsl:attribute>
+ </axsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- Use complete tree traversal -->
+ <xsl:when test="@document">
+ <!-- External document -->
+ <axsl:for-each select="{@document}">
+ <axsl:apply-templates select="." mode="M{count(preceding-sibling::*)}"/>
+ </axsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <axsl:apply-templates select="/" mode="M{count(preceding-sibling::*)}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!--/xsl:if-->
+ </xsl:template>
+
+ <xsl:template match="iso:pattern[@abstract='true']">
+
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">28</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:template>
+
+ <!-- Here is the template for the normal case of patterns -->
+ <xsl:template match="iso:pattern[not(@abstract='true')]">
+
+ <xsl:if test="($phase = '#ALL')
+ or (../iso:phase[@id= $phase]/iso:active[@pattern= current()/@id])">
+ <xsl:text> </xsl:text>
+ <xsl:comment>PATTERN <xsl:value-of select="@id" /> <xsl:value-of select="iso:title" /> </xsl:comment><xsl:text> </xsl:text>
+ <xsl:apply-templates />
+
+ <!-- DPC select-contexts test -->
+ <xsl:if test="not($select-contexts)">
+ <axsl:template match="text()" priority="-1" mode="M{count(preceding-sibling::*)}">
+ <!-- strip characters -->
+ </axsl:template>
+
+ <!-- DPC introduce context-xpath variable -->
+ <axsl:template match="@*|node()"
+ priority="-2"
+ mode="M{ count(preceding-sibling::*) }">
+ <axsl:apply-templates select="{$context-xpath}" mode="M{count(preceding-sibling::*)}"/>
+ </axsl:template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- ISO PHASE -->
+ <xsl:template match="iso:phase" >
+ <xsl:if test="not(@id)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">29</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+
+ <!-- PROPERTY Experiemental -->
+ <!-- We use a mode here to maintain backwards compatability, instead of adding it
+ to the other mode.
+ -->
+ <xsl:template match="iso:property" mode="check-property">
+ <xsl:if test="not(@id)">
+ <xsl:message>No property found with that ID</xsl:message>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="iso:property" >
+ <xsl:call-template name="process-property">
+
+ <xsl:with-param name="id" select="@id"/>
+
+ <xsl:with-param name="name" select="@name"/>
+ <xsl:with-param name="value" select="@value" />
+ <xsl:with-param name="contents" select="*|text()" />
+ </xsl:call-template>
+
+ </xsl:template>
+
+ <!-- PROPERTIES experimental extension -->
+ <xsl:template match="iso:properties" >
+ <xsl:apply-templates mode="check-properties" select="property" />
+ </xsl:template>
+
+
+
+ <!-- ISO RULE -->
+ <xsl:template match="iso:rule[not(@abstract='true')] ">
+ <xsl:if test="not(@context)">
+ <xsl:message ><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">30</xsl:with-param></xsl:call-template></xsl:message>
+
+ <xsl:message terminate="yes" />
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <xsl:comment>RULE <xsl:value-of select="@id" /> </xsl:comment><xsl:text> </xsl:text>
+ <xsl:if test="iso:title">
+ <xsl:comment><xsl:value-of select="iso:title" /></xsl:comment>
+ </xsl:if>
+ <!-- DPC select-contexts -->
+ <xsl:if test="$select-contexts='key'">
+ <axsl:key name="M"
+ match="{@context}"
+ use="'M{count(../preceding-sibling::*)}'"/>
+ </xsl:if>
+
+
+<!-- DPC priorities count up from 1000 not down from 4000 (templates in same priority order as before) -->
+ <axsl:template match="{@context}"
+ priority="{1000 + count(following-sibling::*)}" mode="M{count(../preceding-sibling::*)}">
+
+ <xsl:call-template name="process-rule">
+ <xsl:with-param name="context" select="@context"/>
+
+ <xsl:with-param name="properties" select="@properties" />
+
+ <!-- "Rich" properties -->
+ <xsl:with-param name="fpi" select="@fpi"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ <xsl:with-param name="see" select="@see" />
+ <xsl:with-param name="space" select="@xml:space" />
+
+ <!-- "Linking" properties -->
+ <xsl:with-param name="role" select="@role" />
+ <xsl:with-param name="subject" select="@subject" />
+ </xsl:call-template>
+
+
+ <xsl:apply-templates/>
+ <!-- DPC introduce context-xpath and select-contexts variables -->
+ <xsl:if test="not($select-contexts)">
+ <axsl:apply-templates select="{$context-xpath}" mode="M{count(../preceding-sibling::*)}"/>
+ </xsl:if>
+ </axsl:template>
+ </xsl:template>
+
+
+ <!-- ISO ABSTRACT RULE -->
+ <xsl:template match="iso:rule[@abstract='true'] " >
+ <xsl:if test=" not(@id)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">31</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:if test="@context">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">32</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="iso:rule[@abstract='true']"
+ mode="extends" >
+ <xsl:if test="@context">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">33</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- ISO SPAN -->
+ <xsl:template match="iso:span" mode="text">
+ <xsl:call-template name="process-span">
+ <xsl:with-param name="class" select="@class"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- ISO TITLE -->
+
+ <xsl:template match="iso:schema/iso:title" priority="1">
+ <xsl:call-template name="process-schema-title" />
+ </xsl:template>
+
+
+ <xsl:template match="iso:title" >
+ <xsl:call-template name="process-title" />
+ </xsl:template>
+
+
+ <!-- ISO VALUE-OF -->
+ <xsl:template match="iso:value-of" mode="text" >
+ <xsl:if test="not(@select)">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">34</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+ <xsl:call-template name="IamEmpty" />
+
+ <xsl:choose>
+ <xsl:when test="@select">
+ <xsl:call-template name="process-value-of">
+ <xsl:with-param name="select" select="@select"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise >
+ <xsl:call-template name="process-value-of">
+ <xsl:with-param name="select" select="'.'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+
+<!-- ============================================================== -->
+<!-- DEFAULT TEXT HANDLING -->
+<!-- ============================================================== -->
+ <xsl:template match="text()" priority="-1" mode="do-keys">
+ <!-- strip characters -->
+ </xsl:template>
+ <xsl:template match="text()" priority="-1" mode="do-all-patterns">
+ <!-- strip characters -->
+ </xsl:template>
+ <xsl:template match="text()" priority="-1" mode="do-schema-p">
+ <!-- strip characters -->
+ </xsl:template>
+ <xsl:template match="text()" priority="-1" mode="do-pattern-p">
+ <!-- strip characters -->
+ </xsl:template>
+
+ <xsl:template match="text()" priority="-1">
+ <!-- Strip characters -->
+ </xsl:template>
+
+ <xsl:template match="text()" mode="text">
+ <xsl:value-of select="."/>
+ </xsl:template>
+
+ <xsl:template match="text()" mode="inline-text">
+ <xsl:value-of select="."/>
+ </xsl:template>
+
+<!-- ============================================================== -->
+<!-- UTILITY TEMPLATES -->
+<!-- ============================================================== -->
+<xsl:template name="IamEmpty">
+ <xsl:if test="count( * )">
+ <xsl:message>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">35a</xsl:with-param></xsl:call-template>
+ <xsl:value-of select="name(.)"/>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">35b</xsl:with-param></xsl:call-template>
+ </xsl:message>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="diagnosticsSplit">
+ <!-- Process at the current point the first of the <diagnostic> elements
+ referred to parameter str, and then recurse -->
+ <xsl:param name="str"/>
+ <xsl:variable name="start">
+ <xsl:choose>
+ <xsl:when test="contains($str,' ')">
+ <xsl:value-of select="substring-before($str,' ')"/>
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="$str"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="end">
+ <xsl:if test="contains($str,' ')">
+ <xsl:value-of select="substring-after($str,' ')"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <!-- This works with all namespaces -->
+ <xsl:if test="not(string-length(normalize-space($start)) = 0)
+ and not(//iso:diagnostic[@id = $start])
+ and not(//schold:diagnostic[@id = $start])
+ and not(//diagnostic[@id = $start])">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">36a</xsl:with-param></xsl:call-template>
+ <xsl:value-of select="string($start)"/>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">36b</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+
+ <xsl:if test="string-length(normalize-space($start)) > 0">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates
+ select="//iso:diagnostic[@id = $start ]
+ | //schold:diagnostic[@id = $start ]
+ | //diagnostic[@id= $start ]"/>
+ </xsl:if>
+
+ <xsl:if test="not($end='')">
+ <xsl:call-template name="diagnosticsSplit">
+ <xsl:with-param name="str" select="$end"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+
+
+<xsl:template name="propertiesSplit">
+ <!-- Process at the current point the first of the <property> elements
+ referred to parameter str, and then recurse -->
+ <xsl:param name="str"/>
+ <xsl:variable name="start">
+ <xsl:choose>
+ <xsl:when test="contains($str,' ')">
+ <xsl:value-of select="substring-before($str,' ')"/>
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="$str"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="end">
+ <xsl:if test="contains($str,' ')">
+ <xsl:value-of select="substring-after($str,' ')"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <!-- This works with all namespaces -->
+ <xsl:if test="not(string-length(normalize-space($start)) = 0)
+ and not(//iso:property[@id = $start])">
+ <xsl:message><xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">36a</xsl:with-param></xsl:call-template>
+ <xsl:value-of select="string($start)"/>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">36b</xsl:with-param></xsl:call-template></xsl:message>
+ </xsl:if>
+
+ <xsl:if test="string-length(normalize-space($start)) > 0">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates
+ select="//iso:property[@id = $start ] "/>
+ </xsl:if>
+
+ <xsl:if test="not($end='')">
+ <xsl:call-template name="propertiesSplit">
+ <xsl:with-param name="str" select="$end"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+
+<!-- It would be nice to use this but xsl:namespace does not
+ allow a fallback -->
+<!--xsl:template name="handle-namespace" version="2.0">
+ <xsl:namespace name="{@prefix}" select="@uri">
+</xsl:template-->
+
+<xsl:template name="handle-namespace">
+ <!-- experimental code from http://eccnet.eccnet.com/pipermail/schematron-love-in/2006-June/000104.html -->
+ <!-- Handle namespaces differently for exslt systems, and default, only using XSLT1 syntax -->
+ <!-- For more info see http://fgeorges.blogspot.com/2007/01/creating-namespace-nodes-in-xslt-10.html -->
+ <xsl:choose>
+ <!-- The following code workds for XSLT2 -->
+ <xsl:when test="element-available('xsl:namespace')">
+ <xsl:namespace name="{@prefix}" select="@uri" />
+ </xsl:when>
+
+ <xsl:when use-when="not(element-available('xsl:namespace'))"
+ test="function-available('exsl:node-set')">
+ <xsl:variable name="ns-dummy-elements">
+ <xsl:element name="{@prefix}:dummy" namespace="{@uri}"/>
+ </xsl:variable>
+ <xsl:variable name="p" select="@prefix"/>
+ <xsl:copy-of select="exsl:node-set($ns-dummy-elements)
+ /*/namespace::*[local-name()=$p]"/>
+ </xsl:when>
+
+ <!-- end XSLT2 code -->
+
+
+ <xsl:when test="@prefix = 'xsl' ">
+ <!-- Do not generate dummy attributes with the xsl: prefix, as these
+ are errors against XSLT, because we presume that the output
+ stylesheet uses the xsl prefix. In any case, there would already
+ be a namespace declaration for the XSLT namespace generated
+ automatically, presumably using "xsl:".
+ -->
+ </xsl:when>
+
+ <xsl:when test="@uri = 'http://www.w3.org/1999/XSL/Transform'">
+ <xsl:message terminate="yes">
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">37a</xsl:with-param></xsl:call-template>
+ <xsl:value-of select="system-property('xsl:vendor')"/>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">37b</xsl:with-param></xsl:call-template>
+ </xsl:message>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:attribute name="{concat(@prefix,':dummy-for-xmlns')}" namespace="{@uri}" />
+
+ </xsl:otherwise>
+ </xsl:choose>
+
+
+</xsl:template>
+
+<!-- ============================================================== -->
+<!-- UNEXPECTED ELEMENTS -->
+<!-- ============================================================== -->
+
+ <xsl:template match="iso:*" priority="-2">
+ <xsl:message>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">38a</xsl:with-param></xsl:call-template>
+ <xsl:value-of select="name(.)"/>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">38b</xsl:with-param></xsl:call-template>
+ </xsl:message>
+ </xsl:template>
+
+
+ <!-- Swallow old namespace elements: there is an upfront test for them elsewhere -->
+ <xsl:template match="schold:*" priority="-2" />
+
+ <xsl:template match="*" priority="-3">
+ <xsl:choose>
+ <xsl:when test=" $allow-foreign = 'false' ">
+ <xsl:message>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">39a</xsl:with-param></xsl:call-template>
+ <xsl:value-of select="name(.)"/>
+ <xsl:call-template name="outputLocalizedMessage" ><xsl:with-param name="number">39b</xsl:with-param></xsl:call-template>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="." />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="iso:*" mode="text" priority="-2" />
+ <xsl:template match="*" mode="text" priority="-3">
+ <xsl:if test=" not( $allow-foreign = 'false') ">
+ <xsl:copy-of select="." />
+ </xsl:if>
+ </xsl:template>
+
+<!-- ============================================================== -->
+<!-- DEFAULT NAMED TEMPLATES -->
+<!-- These are the actions that are performed unless overridden -->
+<!-- ============================================================== -->
+
+ <xsl:template name="process-prolog"/>
+ <!-- no params -->
+
+ <xsl:template name="process-root">
+ <xsl:param name="contents"/>
+ <xsl:param name="id" />
+ <xsl:param name="version" />
+ <xsl:param name="schemaVersion" />
+ <xsl:param name="queryBinding" />
+ <xsl:param name="title" />
+
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+
+ <xsl:copy-of select="$contents"/>
+ </xsl:template>
+
+ <xsl:template name="process-assert">
+
+ <xsl:param name="test"/>
+ <xsl:param name="diagnostics" />
+ <xsl:param name="id" />
+ <xsl:param name="flag" />
+ <xsl:param name="properties" />
+
+ <!-- "Linkable" parameters -->
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+
+
+ <xsl:call-template name="process-message">
+ <xsl:with-param name="pattern" select="$test"/>
+ <xsl:with-param name="role" select="$role"/>
+ </xsl:call-template>
+
+ <xsl:if test=" $terminate = 'yes' or $terminate = 'true' ">
+ <axsl:message terminate="yes">TERMINATING</axsl:message>
+ </xsl:if>
+ <xsl:if test=" $terminate = 'assert' ">
+ <axsl:message terminate="yes">TERMINATING</axsl:message>
+ </xsl:if>
+
+ </xsl:template>
+
+ <xsl:template name="process-report">
+ <xsl:param name="test"/>
+ <xsl:param name="diagnostics" />
+ <xsl:param name="id" />
+ <xsl:param name="flag" />
+ <xsl:param name="properties" />
+
+ <!-- "Linkable" parameters -->
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+
+ <xsl:call-template name="process-message">
+ <xsl:with-param name="pattern" select="$test"/>
+ <xsl:with-param name="role" select="$role"/>
+ </xsl:call-template>
+
+ <xsl:if test=" $terminate = 'yes' or $terminate = 'true' ">
+ <axsl:message terminate="yes">TERMINATING</axsl:message>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="process-diagnostic">
+ <xsl:param name="id" />
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="text"/>
+ <axsl:text> </axsl:text>
+ </xsl:template>
+
+ <xsl:template name="process-dir">
+ <xsl:param name="value" />
+
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="inline-text"/>
+ <axsl:text> </axsl:text>
+ </xsl:template>
+
+ <xsl:template name="process-emph">
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="inline-text"/>
+ <axsl:text> </axsl:text>
+ </xsl:template>
+
+ <xsl:template name="process-name">
+ <xsl:param name="name"/>
+
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <axsl:value-of select="{$name}"/>
+ <axsl:text> </axsl:text>
+
+ </xsl:template>
+
+ <xsl:template name="process-ns" >
+ <!-- Note that process-ns is for reporting. The iso:ns elements are
+ independently used in the iso:schema template to provide namespace bindings -->
+ <xsl:param name="prefix"/>
+ <xsl:param name="uri" />
+ </xsl:template>
+
+ <xsl:template name="process-p">
+ <xsl:param name="id" />
+ <xsl:param name="class" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ </xsl:template>
+
+ <xsl:template name="process-pattern">
+ <xsl:param name="id" />
+ <xsl:param name="name" />
+ <xsl:param name="is-a" />
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ </xsl:template>
+
+
+ <xsl:template name="process-rule">
+ <xsl:param name="context" />
+
+ <xsl:param name="id" />
+ <xsl:param name="flag" />
+ <xsl:param name="properties" />
+
+ <!-- "Linkable" parameters -->
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ </xsl:template>
+
+ <xsl:template name="process-span" >
+ <xsl:param name="class" />
+
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="inline-text"/>
+ <axsl:text> </axsl:text>
+ </xsl:template>
+
+ <xsl:template name="process-title" >
+ <xsl:param name="class" />
+ <xsl:call-template name="process-p">
+ <xsl:with-param name="class">title</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="process-schema-title" >
+ <xsl:param name="class" />
+ <xsl:call-template name="process-title">
+ <xsl:with-param name="class">schema-title</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="process-value-of">
+ <xsl:param name="select"/>
+
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <axsl:value-of select="{$select}"/>
+ <axsl:text> </axsl:text>
+ </xsl:template>
+
+ <!-- default output action: the simplest customization is to just override this -->
+ <xsl:template name="process-message">
+ <xsl:param name="pattern" />
+ <xsl:param name="role" />
+
+ <xsl:apply-templates mode="text"/>
+ <xsl:if test=" $message-newline = 'true'" >
+ <axsl:value-of select="string(' ')"/>
+ </xsl:if>
+
+ </xsl:template>
+
+
+ <!-- ===================================================== -->
+ <!-- Extension API: default rules -->
+ <!-- This allows the transmission of extra attributes on -->
+ <!-- rules, asserts, reports, diagnostics. -->
+ <!-- ===================================================== -->
+
+
+
+ <xsl:template name="process-property">
+ <xsl:param name="id" />
+
+ <xsl:param name="name"/>
+ <xsl:param name="value"/>
+ <xsl:param name="contents"/>
+
+ </xsl:template>
+
+
+ <!-- ===================================================== -->
+ <!-- Localization -->
+ <!-- ===================================================== -->
+ <!--
+ All messages generated by the skeleton during processing are localized.
+ (This does not apply to the text that comes from Schematron schemas
+ themselves, of course. Nor does it apply to messages in metastylesheets.)
+
+ Stylesheets have a parameter $langCode which can be used to select the
+ language code (e.g. from the command line)
+
+ The default value of $langCode is "default". When this is used, the
+ message text is taken from the strings below. We use XHTML, to provide
+ the namespace.
+
+ If the $langCode is somethign else, then the XSLT engine will try to
+ find a file called sch-messages-$langCode.xhtml in the same directory
+ as this stylesheet. Expect a fatal error if the file does not exist.
+
+ The file should contain XHTML elements, with the text translated.
+ The strings are located by using ids on each xhtml:p element.
+ The ids are formed by sch-message-$number-$langCode such as
+ sch-message-1-en
+
+ If there is no match in a localization file for a message, then the
+ default will be used. This allows this XSLT to be developed with new
+ messages added without requiring that any localization files be updated.
+
+ In many cases, there are actually two localization strings per message.
+ This happens whenever a message has an embedded value that is dynamically
+ generated (using <value-of>). Having two strings, preceding and following,
+ allows the translator to make idiomatic error messages. When there are
+ two message for a single message, they have numbers like 30a and 30b:
+ translators should check the reference to them in the XSLT above to
+ see what the dynamically generated information is.
+ -->
+ <xsl:template name="outputLocalizedMessage">
+ <xsl:param name="number" />
+
+ <xsl:choose>
+ <xsl:when test="string-length( $langCode ) = 0 or $langCode = 'default'" >
+ <xsl:value-of select='document("")//xhtml:p[@id=concat("sch-message-", $number)]/text()' />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="localizationDocumentFilename" >
+ <xsl:value-of select="concat('sch-messages-', $langCode, '.xhtml')" />
+ </xsl:variable>
+ <xsl:variable name="theLocalizedMessage" >
+ <xsl:value-of select=
+ 'document( $localizationDocumentFilename, /)//xhtml:p[@id=concat("sch-message-", $number, "-", $langCode)]/text()' />
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- if we found any external message with that id, use it -->
+ <xsl:when test=" string-length($theLocalizedMessage) > 0">
+ <xsl:value-of select="$theLocalizedMessage" />
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- otherwise use the default strings -->
+ <xsl:value-of select='document("")//xhtml:p[@id=concat("sch-message-", $number)]/text()' />
+ </xsl:otherwise>
+ </xsl:choose>
+
+
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+<xhtml:div class="ErrorMessages">
+ <!-- Where the error message contains dynamic information, the message has been split into an "a" and a "b" section.
+ This has been done even when the English does not require it, in order to accomodate different language grammars
+ that might position the dynamic information differently.
+ -->
+ <xhtml:p id="sch-message-1">Schema error: Schematron elements in old and new namespaces found</xhtml:p>
+ <xhtml:p id="sch-message-2">Schema error: in the queryBinding attribute, use 'xslt'</xhtml:p>
+ <xhtml:p id="sch-message-3a">Fail: This implementation of ISO Schematron does not work with schemas using the query language </xhtml:p>
+ <xhtml:p id="sch-message-3b"/>
+ <xhtml:p id="sch-message-4a">Phase Error: no phase has been defined with name </xhtml:p>
+ <xhtml:p id="sch-message-4b" />
+ <xhtml:p id="sch-message-5">Markup Error: no pattern attribute in <active></xhtml:p>
+ <xhtml:p id="sch-message-6a">Reference Error: the pattern "</xhtml:p>
+ <xhtml:p id="sch-message-6b">" has been activated but is not declared</xhtml:p>
+ <xhtml:p id="sch-message-7">Markup Error: no test attribute in <assert</xhtml:p>
+ <xhtml:p id="sch-message-8">Markup Error: no test attribute in <report></xhtml:p>
+ <xhtml:p id="sch-message-9">Markup Error: no id attribute in <diagnostic></xhtml:p>
+ <xhtml:p id="sch-message-10">Markup Error: no rule attribute in <extends></xhtml:p>
+ <xhtml:p id="sch-message-11a">Reference Error: the abstract rule "</xhtml:p>
+ <xhtml:p id="sch-message-11b">" has been referenced but is not declared</xhtml:p>
+ <xhtml:p id="sch-message-12">Markup Error: no name attribute in <key></xhtml:p>
+ <xhtml:p id="sch-message-13">Markup Error: no path or use attribute in <key></xhtml:p>
+ <xhtml:p id="sch-message-14">Markup Error: no path or use attribute in <key></xhtml:p>
+ <xhtml:p id="sch-message-15">Schema error: The key element is not in the ISO Schematron namespace. Use the XSLT namespace.</xhtml:p>
+ <xhtml:p id="sch-message-16">Markup Error: no name attribute in <function></xhtml:p>
+ <xhtml:p id="sch-message-17">Schema error: The function element is not in the ISO Schematron namespace. Use the XSLT namespace.</xhtml:p>
+ <xhtml:p id="sch-message-18">Schema error: Empty href= attribute for include directive.</xhtml:p>
+ <xhtml:p id="sch-message-19">Error: Impossible URL in Schematron include</xhtml:p>
+ <xhtml:p id="sch-message-20a">Unable to open referenced included file: </xhtml:p>
+ <xhtml:p id="sch-message-20b" />
+ <xhtml:p id="sch-message-21">Schema error: Use include to include fragments, not a whole schema</xhtml:p>
+ <xhtml:p id="sch-message-22">Schema error: XSD schemas may only be imported if you are using the 'xslt2' query language binding</xhtml:p>
+ <xhtml:p id="sch-message-23">Schema error: The import-schema element is not available in the ISO Schematron namespace. Use the XSLT namespace.</xhtml:p>
+ <xhtml:p id="sch-message-24">Warning: Variables should not be used with the "xpath" query language binding.</xhtml:p>
+ <xhtml:p id="sch-message-25">Warning: Variables should not be used with the "xpath2" query language binding.</xhtml:p>
+ <xhtml:p id="sch-message-26">Markup Error: no uri attribute in <ns></xhtml:p>
+ <xhtml:p id="sch-message-27">Markup Error: no prefix attribute in <ns></xhtml:p>
+ <xhtml:p id="sch-message-28">Schema implementation error: This schema has abstract patterns, yet they are supposed to be preprocessed out already</xhtml:p>
+ <xhtml:p id="sch-message-29">Markup Error: no id attribute in <phase></xhtml:p>
+ <xhtml:p id="sch-message-30">Markup Error: no context attribute in <rule></xhtml:p>
+ <xhtml:p id="sch-message-31">Markup Error: no id attribute on abstract <rule></xhtml:p>
+ <xhtml:p id="sch-message-32">Markup Error: (2) context attribute on abstract <rule></xhtml:p>
+ <xhtml:p id="sch-message-33">Markup Error: context attribute on abstract <rule></xhtml:p>
+ <xhtml:p id="sch-message-34">Markup Error: no select attribute in <value-of></xhtml:p>
+ <xhtml:p id="sch-message-35a">Warning: </xhtml:p>
+ <xhtml:p id="sch-message-35b"> must not contain any child elements</xhtml:p>
+ <xhtml:p id="sch-message-36a">Reference error: A diagnostic "</xhtml:p>
+ <xhtml:p id="sch-message-36b">" has been referenced but is not declared</xhtml:p>
+ <xhtml:p id="sch-message-37a">Using the XSLT namespace with a prefix other than "xsl" in Schematron rules is not supported in this processor:</xhtml:p>
+ <xhtml:p id="sch-message-37b" />
+ <xhtml:p id="sch-message-38a">Error: unrecognized element in ISO Schematron namespace: check spelling and capitalization</xhtml:p>
+ <xhtml:p id="sch-message-38b" />
+ <xhtml:p id="sch-message-39a">Warning: unrecognized element </xhtml:p>
+ <xhtml:p id="sch-message-39b" />
+ </xhtml:div>
+</xsl:stylesheet>
+
+
+
--- /dev/null
+<?xml version="1.0"?><?xar XSLT?>
+
+<!--
+ OVERVIEW
+
+ ASCC/Schematron.com Skeleton Module for ISO Schematron (for XSLT1 systems)
+
+ ISO Schematron is a language for making assertion about the presence or absence
+ of patterns in XML documents. It is typically used for as a schema language, or
+ to augment existing schema languages, and to check business rules. It is very
+ powerful, yet quite simple: a developer only need know XPath and about five other
+ elements.
+
+ This is an open source implementation of ISO Schematron in XSLT. Although ISO does
+ not allow reference implementations which might compete with the text of the
+ standard, this code has been compiled by Rick Jelliffe, inventor of Schematron
+ and editor of the ISO standard; so developers can certainly use it as an
+ unofficial reference implementation for clarification.
+
+ This implementation is based on one by Oliver Becker. API documentation is
+ available separately; try www.schematron.com for this. Funding for this
+ stylesheet over the years has come from Topologi Pty. Ltd., Geotempo Ltd.,
+ and ASCC, Tapei.
+
+ There are two versions of this skeleton: one is tailored for XSLT1 processors
+ and the other is tailored for XSLT2 processors. Future versions of the
+ XSLT2 skeleton may support more features than that the XSLT 1 skeleton.
+-->
+
+<!--
+Open Source Initiative OSI - The MIT License:Licensing
+[OSI Approved License]
+
+This source code was previously available under the zlib/libpng license.
+Attribution is polite.
+
+The MIT License
+
+Copyright (c) 2000-2010 Rick Jellife and Academia Sinica Computing Centre, Taiwan.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+-->
+<!--
+ TIPS
+
+ A tip for new users of Schematron: make your assertions contain positive messages
+ about what is expected, rather than error messages. For example, use the form
+ "An X should have a Y, because Z".
+
+ Another tip is that Schematron provides an
+ element <sch:ns> for declaring the namespaces and prefixes used in Xpaths in
+ attribute values; it does not extend the XML Namespaces mechanism: if a name
+ in an XPath has a prefix, there must be an <sch:ns> element for that prefix; if
+ a name in an XPath does not have a prefix, it is always in no namespace.
+
+ A tip for implementers of Schematron, either using this API or re-implementing it:
+ make the value of the diagnostics, flags and richer features available if possible;
+ Schematron has many of the optional richer features which, if implemented, provide
+ a compelling alternative approach to validation and business-rules checking compared
+ to other schema languages and programs.
+
+ If you create your own meta-stylesheet to override this one, it is a
+ good idea to have both in the same directory and to run the stylesheet
+ from that directory, as many XSLT implementations have ideosyncratic
+ handling of URLs: keep it simple.
+-->
+
+
+<!--
+ INVOCATION INFORMATION
+
+ The following parameters are available
+
+ phase NMTOKEN | "#ALL" (default) Select the phase for validation
+ allow-foreign "true" | "false" (default) Pass non-Schematron elements to the generated stylesheet
+ sch.exslt.imports semi-colon delimited string of filenames for some EXSLT implementations
+ message-newline "true" (default) | "false" Generate an extra newline at the end of messages
+ optimize "visit-no-attributes"
+ debug "true" | "false" (default) Debug mode lets compilation continue despite problems
+ attributes "true" | "false" (Autodetecting) Use only when the schema has no attributes as the context nodes
+ only-child-elements "true" | "false" (Autodetecting) Use only when the schema has no comments
+ or PI as the context nodes
+ terminate= yes | no | true | false | assert Terminate on the first failed assertion or successful report
+ Note: whether any output at all is generated depends on the XSLT implementation.
+
+ The following parameters can be specified as Schematron variables in diagnostics, assertions and so on.
+ fileNameParameter string
+ fileDirParameter string
+ archiveNameParameter string In case of ZIP files
+ archiveDirParameter string In case of ZIP files
+ output-encoding Use when outputting to XML
+
+ Experimental: USE AT YOUR OWN RISK
+ visit-text "true" "false" Also visist text nodes for context. WARNING: NON_STARDARD.
+ select-contents '' | 'key' | '//' Select different implementation strategies
+
+ Conventions: Meta-stylesheets that override this may use the following parameters
+ generate-paths=true|false generate the @location attribute with XPaths
+ diagnose= yes | no Add the diagnostics to the assertion test in reports
+
+-->
+
+<!--
+ XSLT VERSION SUPPORT
+
+ XSLT 1:
+ A schema using the standard XSLT 1 query binding will have a /schema/@queryBinding='xslt' or
+ nothing.
+
+ * Note: XT does not implement key() and will die if given it.
+ * Add all formal parameters to default templates
+ * Fix missing apply-templates from process-ns and add params back
+
+ EXSLT: Experimental support
+ A schema using the EXSLT query binding will have a /schema/@queryBinding='exslt'.
+ It is built on XSLT 1. After experience is gained, this binding is expected to be
+ formalized as part of ISO Schematron, which currently reserves the "exslt" name for this purpose.
+
+ Some EXSLT engines have the extra functions built-in. For these, there is no need to
+ provide library locations. For engines that require the functions, either hard code
+ them in this script or provide them on the command-line argument.
+
+-->
+<!--
+ PROCESS INFORMATION
+
+ This stylesheet compiles a Schematron schema (*.sch) into XSLT code (*.xsl).
+ The generated XSLT code can then be run against an XML file (*.xml, etc) and
+ will produce validation results.
+
+ The output of validation results is performed using named templates (process-*).
+ These can be overridden easily by making a new XSLT stylesheet that imports this
+ stylesheet but has its own version of the relevant process-* templates. Several
+ of these invoking stylesheets are available: "iso_svrl.xsl", for example generates
+ ISO Schematron Validation Report Language format results.
+
+ In this version of the stylesheet, the ISO feature called "abstract patterns" is
+ implemented using macro processing: a prior XSLT stage to which converts uses
+ of abstract patterns into normal patterns. If you do not use abstract patterns,
+ it is not necessary to preprocess the schema.
+
+ To summarize, a basic process flow for some commandline processor is like this:
+ XSLT -input=xxx.sch -output=xxx.xsl -stylesheet=iso_schematron_skeleton.xsl
+ XSLT -input=document.xml -output=xxx-document.results -stylesheet=xxx.xsl
+
+ iso_svrl.xslt is an implementation of Schematron that can use this skeleton and
+ generate ISO SVRL reports. A process flow for some commandline processor would
+ be like this:
+ XSLT -input=xxx.sch -output=xxx.xsl -stylesheet=iso_svrl.xsl
+ XSLT -input=document.xml -output=xxx-document.results -stylesheet=xxx.xsl
+
+ It is not impossible that ultimately a third stage, to handle macro-preprocessing
+ and inclusion, might be necessary. (The trade-off is in making this XSLT more
+ complex compared to making the outer process more complex.)
+
+ This version has so far been tested with
+ Saxon 9
+ MSXML 4 (or 6?)
+
+ Please note that if you are using SAXON and JAXP, then you should use
+ System.setProperty("javax.xml.transform.TransformerFactory",
+ "net.sf.saxon.TransformerFactoryImpl");
+ rather than
+ System.setProperty("javax.xml.xpath.TransformerFactory",
+ "net.sf.saxon.TransformerFactoryImpl");
+ which is does not work, at least for the versions of SAXON we tried.
+-->
+<!--
+ NOTE: Compared to the iso_schematron_skeleton_for_saxon.xsl code, this version is currently missing
+ 1) localization
+ 2) properties
+ 3) pattern/@documents
+
+ VERSION INFORMATION
+ Note that several enhancements for the SAXON/XSLT2 version have not been put in place
+ in this XSLT1 version. Therefore even if the two stylesheets are of the same date, they
+ may not have matching functionality.
+ 2010-04-14
+ * RJ Reorder call-template in exslt case only, report by BD
+ * Add command line parameter 'terminate' which will terminate on first failed
+ 2010-01-24 RJ
+ * Allow let elements to have direct content instead of @value
+ 2009-02-25 RJ
+ * Fix up variable names so none are used twice in same template
+ * Tested on SAXON 9, Xalan 2.7.1. Partly tested MSXML.
+ 2008-09-19 RJ
+ * Add mode schematron-select-full-path and param full-path-notation
+
+ 2008-08-11
+ * TT report/@flag was missing
+ 2008-08-06
+ * TT Top-level lets need to be implemented using xsl:param not xsl:variable
+ * TT xsl:param/@select must have XPath or not be specified
+
+ Version: 2008-07-28
+ * KH schematron-get-full-path-3 has [index] even on top step
+ * RJ fix schematron-get-full-path to have namespace predicate, I don't know why this was removed
+
+ Version: 2008-07-24
+ * RJ clean out commented out namespace handling code
+ * RJ add support for experimental non-standard attribute report/@action
+ and assert/@action, and add parameter not in the published API (should
+ not break anything, it is XSLT1)
+ * RJ Remove remaining XSLT2 code for ease of reading
+
+ Version: 2008-07-14 minor update for inclusion experiments
+ * RJ Clean up zero-length fragment test on include
+ * RJ Add experimental support for include containers
+ * RJ For path generation, test for //iso:schema not just /iso:schema, for potential embedded Schematron support
+ * RJ Don't generate double error messages for old namespace elements
+ * RJ Experimental iso:rule/iso:title just kept as comment (bigger request Uche Ogbuji)
+ * RJ Remove spurious debug messages
+ * RJ Fix bug that prevented including patterns in this (report Roger
+ Costello)
+
+ Version: 2007-10-17
+ From this version on I am forking XSLT2 support to a different version of the script.
+ This is due to the increasingly horrible state of the namespace handling code as well
+ as other inconsistencies between the major implementations of different versions.
+ The intent is that future versions of this will have XSLT2 isms removed and be simplified
+ to cope with only XSLT1 and EXLST. Note that though this version is called
+ iso_schematron_skeleton_for_xslt1, the various meta-stylesheets will continue to just call
+ iso_schematron_skeleton: it is up to you to rename the stylesheet to the one you want to
+ use.
+
+ * RJ fix FULL-PATH problem with attribute names
+
+
+ Version: 2007-07-19
+ Accept most changes in David Carlisle's fork, but continue as XSLT1 script:
+ http://dpcarlisle.blogspot.com/search/label/schematron
+ * DPC Remove "optimize" parameter
+ * DPC Add autodetecting optimize parameter attribute to skip checking attribute
+ context
+ * DPC Add autodetecting optimize parameter only-child-elements turn off checking for
+ comments and PIs
+ * DPC (Experimental: NON_STANDARD DANGER!) Add param visit-text to viist text
+ nodes too for context
+ * DPC Fix inclusion syntax to allow #
+ * DPC Priorities count up from 1000 not down from 4000 to allow more rules
+ * RJ Add new template for titles of schemas, with existing behaviour.
+ Override process-schema-title for custom processing of title
+
+
+ Version: 2007-04-04
+ * RJ debug mode param
+ * RJ alter mixed test to only test mixed branches, so the same document
+ could have old and new namespaces schemas in it, but each schema must
+ be distinct, just so as not to overconstrain things.
+ * KH zero-length include/@href is fatal error, but allow debug mode
+ * SB add hint on SAXON and JAXP
+ * DC generate-full-path-1 generates XLST1 code by default
+ Version: 2007-03-05
+ * AS Typo for EXSLT randome, improve comment
+ * KH get-schematron-full-path-2 needs to apply to attributes too
+ * DP document policy on extensions better
+ * DC use copy-of not copy for foreign elements
+ * DC add generate-path-2
+ * DC don't try to apply templates to attribute axis on attribute nodes, to
+ stop SAXON warning.
+ * RJ improve reporting of typos
+
+ Version: 2007-02-08
+ * KH Schematron fullpath implementation: @* handled twice and / missing
+ * KH Change stylesheetbody from named template to mode to allow implementers more flexibility.
+ Move process-ns to outside the stylesheet body.
+ * DP, FG, fix handling of xslt:key
+ * FG no iso:title/@class
+ * Experimental optimization 'visit-no-attributes'
+ * KH Experimental added schematron-get-full-path-2 which gives prefixed version for humans
+ * DC Move stylesheet/@version generation to after namespace handling
+ * DC, FG EXSLT namespace handling code
+ * FG add ref and commented code from FG's page on namespaces
+ * Start adding normalize-space() to parameter code
+ * Add a space between diagnostics
+
+ Version: 2007-01-22
+ * DP change = ($start) to = $start and =($phase) to =$phase
+ to run under Saxon 8.8j
+ * FG better title section using ( @id | sch:title)[last()]
+ * Default query language binding is "xslt" not "xslt1"
+
+ Version: 2007-01-19
+ * Simplify message newline code
+ * Remove termination and xpath appending to message options:
+ factor out as iso_schematron_terminator.xsl
+ * Comment out XSLT2 namespace fix temporarily
+
+ Version: 2007-01-18 (First beta candidate for comment)
+ * DC remove xml:space="preserve"
+ * FG improve comment on import statement
+ * DC improve comments on invocation section
+ * Add exploratory support for sch:schema[@queryBinding='xpath']
+ by allowing it and warning as lets are found
+ * Be strict about queryBinding spelling errors
+ * Extra comments on the different queryBindings
+ * KH Add option "message-paths" to generate XPath from output
+ * KH Add option "terminate" to halt with an error after the first assertion
+ * KH refactor paths in schematron-full-path
+ * Improve (?) namespace handling: no dummy attributes for prefix "xsl" generated
+
+ Version: 2007-01-15
+ * FG fix for calling templates
+ * Add formal parameters to default templates: may help XSLT 2
+ * Fix get-schematron-full-path
+ * Include skeleton1-6 is commented out by default
+
+ Version:2007-01-12 (Pre-beta release to Schematron-love-in maillist)
+ * Add many extra parameters to the process-* calls, so that almost
+ all the information in the schema can be provided to client programs.
+ Also, rearrange the parameters to fit in with the ISO schema, which
+ has "rich" and "linkable" attribute groups.
+ * Warn on diagnostics with no ID once only
+ * Improved path reporting, to handle for namespaces
+ * Add process-title dummy template for API
+ * Add command-line parameter allow-foreign (true|false) to suppress
+ warnings one foreign elements and pass them through to the generated
+ stylesheet
+ * remove legacy templates for the old ASCC namespace and no namespace,
+ and use an import statement instead. Much cleaner now!
+ * patterns use @id not @name
+ * titles can contain sub-elements
+ * start change sch:rule to allow attributes, PIs and comments
+ * the default process-* for inline elements add a leading and trailing
+ space, to reduce the chance of concatenation.
+ * add comments to make the generated code clearer
+
+ Version:2006-11-07 (ISO: first release private to schematron-love-in maillist for review)
+ * Duplicate pattern templates, for handling ISO namespace
+ * Add priority onto default and paragraph templates
+ * Add namespace checks
+ * Handle key in xsl namespace not iso
+ * Add include
+ * Improve namespace handling
+ * Preliminary XSLT2 and EXSLT support
+ * Refactor iso:schema for clarity
+
+ Version: 2003-05-26
+ * Fix bug with key
+ Version: 2003-04-16
+ * handle 1.6 let expressions
+ * make key use XSLT names, and allow anywhere
+ Version: 2001-06-13
+ * same skeleton now supports namespace or no namespace
+ * parameters to handlers updated for all 1.5 attributes
+ * diagnostic hints supported: command-line option diagnose=yes|no
+ * phases supported: command-line option phase=#ALL|...
+ * abstract rules
+ * compile-time error messages
+ * add utility routine generate-id-from-path
+
+ Contributors: Rick Jelliffe (original), Oliver Becker (architecture, XSLT2),
+ Miloslav Nic (diagnostic, phase, options), Ludwig Svenonius (abstract)
+ Uche Ogbuji (misc. bug fixes), Jim Ancona (SAXON workaround),
+ Francis Norton (generate-id-from-path), Robert Leftwich, Bryan Rasmussen,
+ Dave Pawson (include, fallback), Florent Georges (namespaces, exslt, attribute
+ context), Benoit Maisonny (attribute context), John Dumps (process-message newline),
+ Cliff Stanford (diagnostics and other newlines)
+
+
+ KNOWN TYPICAL LIMITATIONS:
+ * Don't use <sch:ns prefix="xsl" .../> with a namespace other than the standard
+ XSLT one. This would be a bizarre thing to do anyway.
+ * Don't use other prefixes for the XSLT namespace either; some implementations will
+ not handle it correctly.
+
+ EXTENSIONS:
+ ISO Schematron is designed as a framework with some standard query language
+ bindings. If you need to support other features, please do so safely by making
+ up your own @queryLanguage name: this makes it clear that your schema requires
+ special features. For example, default ISO Schematron does not support user
+ defined functions; so if you want to use the user defined function feature
+ in XSLT, you need to have a schema with some queryBinding attribute name like
+ "XSLT-with-my-functions" or whatever.
+-->
+
+
+
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias"
+ xmlns:sch="http://www.ascc.net/xml/schematron"
+ xmlns:iso="http://purl.oclc.org/dsdl/schematron"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:msxsl="urn:schemas-microsoft-com:xslt"
+ extension-element-prefixes="exsl msxsl"
+ >
+<!-- This program implements ISO Schematron, except for abstract patterns which require a preprocess. -->
+
+
+<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>
+
+
+<!-- Category: top-level-element -->
+<xsl:output method="xml" omit-xml-declaration="no" standalone="yes" indent="yes"/>
+
+
+<xsl:param name="phase">
+ <xsl:choose>
+ <xsl:when test="//sch:schema/@defaultPhase">
+ <xsl:value-of select="//sch:schema/@defaultPhase"/>
+ </xsl:when>
+ <xsl:when test="//iso:schema/@defaultPhase">
+ <xsl:value-of select="//iso:schema/@defaultPhase"/>
+ </xsl:when>
+ <xsl:otherwise>#ALL</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:param name="allow-foreign">false</xsl:param>
+
+<xsl:param name="message-newline">true</xsl:param>
+
+<!-- DPC set to true if contexts should be checked on attribute nodes
+ defaults to true if there is any possibility that a context could match an attribute,
+ err on the side if caution, a context of *[.='@'] would cause this param to defualt to true
+ even though @ is in a string
+-->
+<xsl:param name="attributes">
+ <xsl:choose>
+ <xsl:when test="//iso:rule[contains(@context,'@') or contains(@context,'attribute')]">true</xsl:when>
+ <xsl:otherwise>false</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<!-- DPC set to true if contexts should be checked on just elements in the child axis
+ defaults to true if there is any possibility that a context could match an comment or PI
+ err on the side if caution, a context of *[.='('] would cause this param to defualt to true
+ even though ( is in a string, but node() comment() and processing-instruction() all have a (
+-->
+<xsl:param name="only-child-elements">
+ <xsl:choose>
+ <xsl:when test="//iso:rule[contains(@context,'(')]">true</xsl:when>
+ <xsl:otherwise>false</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<!-- DPC set to true if contexts should be checked on text nodes nodes (if only-child-elements is false)
+ THIS IS NON CONFORMANT BEHAVIOUR JUST FOR DISCUSSION OF A POSSIBLE CHANGE TO THE
+ SPECIFICATION. THIS PARAM SHOULD GO IF THE FINAL DECISION IS THAT THE SPEC DOES NOT CHANGE.
+ Always defaults to false
+-->
+<xsl:param name="visit-text" select="'false'"/>
+
+<!-- DPC
+ When selecting contexts the specified behaviour is
+ @*|node()[not(self::text())]
+ The automatic settings may use
+ node()[not(self::text())]
+ @*|*
+ *
+ instead for schema for which they are equivalent.
+ If the params are set explictly the above may be used, and also either if
+ @*
+ @*|node()
+ in all cases the result may not be equivalent, for example if you specify no attributes and the schema
+ does have attribute contexts they will be silently ignored.
+
+ after testing it turns out that
+ node()[not(self::text())] is slower in saxon than *|comment()|processing-instruction()
+ which I find a bit surprising but anyway I'll use the longr faster version.
+-->
+<xsl:variable name="context-xpath">
+ <xsl:if test="$attributes='true'">@*|</xsl:if>
+ <xsl:choose>
+ <xsl:when test="$only-child-elements='true'">*</xsl:when>
+ <xsl:when test="$visit-text='true'">node()</xsl:when>
+ <xsl:otherwise>*|comment()|processing-instruction()</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<!-- DPC if this is set to
+ '' use recursive templates to iterate over document tree,
+ 'key' select all contexts with a key rather than walking the tree explictly in each mode
+ '//' select all contexts with // a key rather than walking the tree explictly in each mode (XSLT2 only)
+-->
+<xsl:param name="select-contexts" select="''"/>
+
+
+<xsl:param name="output-encoding"/>
+
+<xsl:param name="terminate">false</xsl:param>
+
+<!-- e.g. saxon file.xml file.xsl "sch.exslt.imports=.../string.xsl;.../math.xsl" -->
+<xsl:param name="sch.exslt.imports"/>
+
+<!-- Set the language code for messages -->
+<xsl:param name="langCode">default</xsl:param>
+
+<xsl:param name="debug">false</xsl:param>
+
+
+<!-- Set the default for schematron-select-full-path, i.e. the notation for svrl's @location-->
+<xsl:param name="full-path-notation">1</xsl:param>
+
+<!-- Simple namespace check -->
+<xsl:template match="/">
+ <xsl:if test="//sch:*[ancestor::iso:* or descendant::iso:*]">
+ <xsl:message>Schema error: Schematron elements in old and new namespaces found</xsl:message>
+ <xsl:if test=" $debug = 'false' " />
+ </xsl:if>
+
+ <xsl:apply-templates />
+</xsl:template>
+
+
+<!-- ============================================================== -->
+<!-- ISO SCHEMATRON SCHEMA ELEMENT -->
+<!-- Not handled: Abstract patterns. A pre-processor is assumed. -->
+<!-- ============================================================== -->
+
+<!-- SCHEMA -->
+<!-- Default uses XSLT 1 -->
+<xsl:template match="iso:schema[not(@queryBinding) or @queryBinding='xslt'
+ or @queryBinding='xslt1' or @queryBinding='XSLT' or @queryBinding='XSLT1'
+ or @queryBinding='xpath']">
+ <xsl:if test="
+ @queryBinding='xslt1' or @queryBinding='XSLT' or @queryBinding='XSLT1'">
+ <xsl:message>Schema error: in the queryBinding attribute, use 'xslt'</xsl:message>
+ </xsl:if>
+ <axsl:stylesheet>
+ <xsl:apply-templates select="iso:ns"/>
+ <!-- Handle the namespaces before the version attribute: reported to help SAXON -->
+ <xsl:attribute name="version">1.0</xsl:attribute>
+
+ <xsl:apply-templates select="." mode="stylesheetbody"/>
+ <!-- was xsl:call-template name="stylesheetbody"/ -->
+ </axsl:stylesheet>
+</xsl:template>
+
+<!-- Using EXSLT with all modeles (except function module: not applicable) -->
+<xsl:template match="iso:schema[@queryBinding='exslt']" priority="10">
+ <xsl:comment>This XSLT was automatically generated from a Schematron schema.</xsl:comment>
+ <axsl:stylesheet
+ xmlns:date="http://exslt.org/dates-and-times"
+ xmlns:dyn="http://exslt.org/dynamic"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:math="http://exslt.org/math"
+ xmlns:random="http://exslt.org/random"
+ xmlns:regexp="http://exslt.org/regular-expressions"
+ xmlns:set="http://exslt.org/sets"
+ xmlns:str="http://exslt.org/strings"
+ extension-element-prefixes="date dyn exsl math random regexp set str" >
+
+ <xsl:apply-templates select="iso:ns"/>
+ <!-- Handle the namespaces before the version attribute: reported to help SAXON -->
+ <xsl:attribute name="version">1.0</xsl:attribute>
+
+ <xsl:apply-templates select="." mode="stylesheetbody"/>
+ <!-- was xsl:call-template name="stylesheetbody"/ -->
+ </axsl:stylesheet>
+</xsl:template>
+
+
+<!-- Uses unknown query language binding -->
+<xsl:template match="iso:schema" priority="-1">
+ <xsl:message terminate="yes" >Fail: This implementation of ISO Schematron does not work with
+ schemas using the "<xsl:value-of select="@queryBinding"/>" query language.</xsl:message>
+</xsl:template>
+
+<xsl:template match="*" mode="stylesheetbody">
+ <!--xsl:template name="stylesheetbody"-->
+ <xsl:comment>Implementers: please note that overriding process-prolog or process-root is
+ the preferred method for meta-stylesheets to use where possible. </xsl:comment><xsl:text> </xsl:text>
+
+ <!-- These parameters may contain strings with the name and directory of the file being
+ validated. For convenience, if the caller only has the information in a single string,
+ that string could be put in fileDirParameter. The archives parameters are available
+ for ZIP archives.
+ -->
+
+ <xsl:call-template name="iso:exslt.add.imports" /> <!-- RJ moved report BH -->
+ <axsl:param name="archiveDirParameter" />
+ <axsl:param name="archiveNameParameter" />
+ <axsl:param name="fileNameParameter" />
+ <axsl:param name="fileDirParameter" />
+
+ <xsl:text> </xsl:text><xsl:comment>PHASES</xsl:comment><xsl:text> </xsl:text>
+ <xsl:call-template name="handle-phase"/>
+ <xsl:text> </xsl:text><xsl:comment>PROLOG</xsl:comment><xsl:text> </xsl:text>
+ <xsl:call-template name="process-prolog"/>
+ <xsl:text> </xsl:text><xsl:comment>KEYS</xsl:comment><xsl:text> </xsl:text>
+ <xsl:apply-templates mode="do-keys" select="xsl:key "/>
+ <xsl:text> </xsl:text><xsl:comment>DEFAULT RULES</xsl:comment><xsl:text> </xsl:text>
+ <xsl:call-template name="generate-default-rules" />
+ <xsl:text> </xsl:text><xsl:comment>SCHEMA METADATA</xsl:comment><xsl:text> </xsl:text>
+ <xsl:call-template name="handle-root"/>
+ <xsl:text> </xsl:text><xsl:comment>SCHEMATRON PATTERNS</xsl:comment><xsl:text> </xsl:text>
+
+ <xsl:apply-templates select="*[not(self::iso:ns)] " />
+</xsl:template>
+
+ <xsl:template name="iso:exslt.add.imports">
+ <xsl:param name="imports" select="$sch.exslt.imports"/>
+ <xsl:choose>
+ <xsl:when test="contains($imports, ';')">
+ <axsl:import href="{ substring-before($imports, ';') }"/>
+ <xsl:call-template name="iso:exslt.add.imports">
+ <xsl:with-param name="imports" select="substring-after($imports, ';')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$imports">
+ <axsl:import href="{ $imports }"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+<xsl:template name="handle-phase" >
+ <xsl:if test="not(normalize-space( $phase ) = '#ALL')">
+ <xsl:if test="not(iso:phase[@id = normalize-space( $phase )])">
+ <xsl:message>Phase Error: no phase with name <xsl:value-of select="normalize-space( $phase )"
+ /> has been defined.</xsl:message>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate-default-rules">
+ <xsl:text> </xsl:text>
+ <xsl:comment>MODE: SCHEMATRON-SELECT-FULL-PATH</xsl:comment><xsl:text> </xsl:text>
+ <xsl:comment>This mode can be used to generate an ugly though full XPath for locators</xsl:comment><xsl:text> </xsl:text>
+ <axsl:template match="*" mode="schematron-select-full-path">
+ <xsl:choose>
+ <xsl:when test=" $full-path-notation = '1' ">
+ <!-- Use for computers, but rather unreadable for humans -->
+ <axsl:apply-templates select="." mode="schematron-get-full-path"/>
+ </xsl:when>
+ <xsl:when test=" $full-path-notation = '2' ">
+ <!-- Use for humans, but no good for paths unless namespaces are known out-of-band -->
+ <axsl:apply-templates select="." mode="schematron-get-full-path-2"/>
+ </xsl:when>
+ <xsl:when test=" $full-path-notation = '3' ">
+ <!-- Obsolescent. Use for humans, but no good for paths unless namespaces are known out-of-band -->
+ <axsl:apply-templates select="." mode="schematron-get-full-path-3"/>
+ </xsl:when>
+
+ <xsl:otherwise >
+ <!-- Use for computers, but rather unreadable for humans -->
+ <axsl:apply-templates select="." mode="schematron-get-full-path"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </axsl:template>
+
+
+ <xsl:text> </xsl:text>
+ <xsl:comment>MODE: SCHEMATRON-FULL-PATH</xsl:comment><xsl:text> </xsl:text>
+ <xsl:comment>This mode can be used to generate an ugly though full XPath for locators</xsl:comment><xsl:text> </xsl:text>
+ <axsl:template match="*" mode="schematron-get-full-path">
+ <axsl:apply-templates select="parent::*" mode="schematron-get-full-path"/>
+
+ <!-- XSLT1 syntax -->
+
+ <axsl:text>/</axsl:text>
+ <axsl:choose>
+ <axsl:when test="namespace-uri()=''">
+ <axsl:value-of select="name()"/>
+ <axsl:variable name="p_1" select="1+
+ count(preceding-sibling::*[name()=name(current())])" />
+ <axsl:if test="$p_1>1 or following-sibling::*[name()=name(current())]">
+ <xsl:text/>[<axsl:value-of select="$p_1"/>]<xsl:text/>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:text>*[local-name()='</axsl:text>
+ <axsl:value-of select="local-name()"/><axsl:text>' and namespace-uri()='</axsl:text>
+ <axsl:value-of select="namespace-uri()"/>
+ <axsl:text>']</axsl:text>
+ <axsl:variable name="p_2" select="1+
+ count(preceding-sibling::*[local-name()=local-name(current())])" />
+ <axsl:if test="$p_2>1 or following-sibling::*[local-name()=local-name(current())]">
+ <xsl:text/>[<axsl:value-of select="$p_2"/>]<xsl:text/>
+ </axsl:if>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+
+
+ <axsl:template match="@*" mode="schematron-get-full-path">
+
+ <!-- XSLT1 syntax -->
+ <axsl:text>/</axsl:text>
+ <axsl:choose>
+ <axsl:when test="namespace-uri()=''">@<axsl:value-of
+ select="name()"/></axsl:when>
+ <axsl:otherwise>
+ <axsl:text>@*[local-name()='</axsl:text>
+ <axsl:value-of select="local-name()"/>
+ <axsl:text>' and namespace-uri()='</axsl:text>
+ <axsl:value-of select="namespace-uri()"/>
+ <axsl:text>']</axsl:text>
+ </axsl:otherwise>
+ </axsl:choose>
+
+ </axsl:template>
+
+
+ <xsl:text> </xsl:text>
+
+ <xsl:comment>MODE: SCHEMATRON-FULL-PATH-2</xsl:comment>
+ <xsl:text> </xsl:text>
+ <xsl:comment>This mode can be used to generate prefixed XPath for humans</xsl:comment>
+ <xsl:text> </xsl:text>
+ <!--simplify the error messages by using the namespace prefixes of the
+ instance rather than the generic namespace-uri-styled qualification-->
+ <axsl:template match="node() | @*" mode="schematron-get-full-path-2">
+ <!--report the element hierarchy-->
+ <axsl:for-each select="ancestor-or-self::*">
+ <axsl:text>/</axsl:text>
+ <axsl:value-of select="name(.)"/>
+ <axsl:if test="preceding-sibling::*[name(.)=name(current())]">
+ <axsl:text>[</axsl:text>
+ <axsl:value-of
+ select="count(preceding-sibling::*[name(.)=name(current())])+1"/>
+ <axsl:text>]</axsl:text>
+ </axsl:if>
+ </axsl:for-each>
+ <!--report the attribute-->
+ <axsl:if test="not(self::*)">
+ <axsl:text/>/@<axsl:value-of select="name(.)"/>
+ </axsl:if>
+ </axsl:template>
+
+ <xsl:text> </xsl:text>
+ <xsl:comment>MODE: GENERATE-ID-FROM-PATH </xsl:comment><xsl:text> </xsl:text>
+ <!-- repeatable-id maker derived from Francis Norton's. -->
+ <!-- use this if you need generate ids in separate passes,
+ because generate-id() is not guaranteed to produce the same
+ results each time. These ids are not XML names but closer to paths. -->
+ <axsl:template match="/" mode="generate-id-from-path"/>
+ <axsl:template match="text()" mode="generate-id-from-path">
+ <axsl:apply-templates select="parent::*" mode="generate-id-from-path"/>
+ <axsl:value-of select="concat('.text-', 1+count(preceding-sibling::text()), '-')"/>
+ </axsl:template>
+ <axsl:template match="comment()" mode="generate-id-from-path">
+ <axsl:apply-templates select="parent::*" mode="generate-id-from-path"/>
+ <axsl:value-of select="concat('.comment-', 1+count(preceding-sibling::comment()), '-')"/>
+ </axsl:template>
+ <axsl:template match="processing-instruction()" mode="generate-id-from-path">
+ <axsl:apply-templates select="parent::*" mode="generate-id-from-path"/>
+ <axsl:value-of
+ select="concat('.processing-instruction-', 1+count(preceding-sibling::processing-instruction()), '-')"/>
+ </axsl:template>
+ <axsl:template match="@*" mode="generate-id-from-path">
+ <axsl:apply-templates select="parent::*" mode="generate-id-from-path"/>
+ <axsl:value-of select="concat('.@', name())"/>
+ </axsl:template>
+ <axsl:template match="*" mode="generate-id-from-path" priority="-0.5">
+ <axsl:apply-templates select="parent::*" mode="generate-id-from-path"/>
+ <axsl:text>.</axsl:text>
+<!--
+ <axsl:choose>
+ <axsl:when test="count(. | ../namespace::*) = count(../namespace::*)">
+ <axsl:value-of select="concat('.namespace::-',1+count(namespace::*),'-')"/>
+ </axsl:when>
+ <axsl:otherwise>
+-->
+ <axsl:value-of
+ select="concat('.',name(),'-',1+count(preceding-sibling::*[name()=name(current())]),'-')"/>
+<!--
+ </axsl:otherwise>
+ </axsl:choose>
+-->
+ </axsl:template>
+
+
+ <xsl:comment>MODE: SCHEMATRON-FULL-PATH-3</xsl:comment>
+
+ <xsl:text> </xsl:text>
+ <xsl:comment>This mode can be used to generate prefixed XPath for humans
+ (Top-level element has index)</xsl:comment>
+ <xsl:text> </xsl:text>
+ <!--simplify the error messages by using the namespace prefixes of the
+ instance rather than the generic namespace-uri-styled qualification-->
+ <axsl:template match="node() | @*" mode="schematron-get-full-path-3">
+ <!--report the element hierarchy-->
+ <axsl:for-each select="ancestor-or-self::*">
+ <axsl:text>/</axsl:text>
+ <axsl:value-of select="name(.)"/>
+ <axsl:if test="parent::*">
+ <axsl:text>[</axsl:text>
+ <axsl:value-of
+ select="count(preceding-sibling::*[name(.)=name(current())])+1"/>
+ <axsl:text>]</axsl:text>
+ </axsl:if>
+ </axsl:for-each>
+ <!--report the attribute-->
+ <axsl:if test="not(self::*)">
+ <axsl:text/>/@<axsl:value-of select="name(.)"/>
+ </axsl:if>
+ </axsl:template>
+
+ <xsl:text> </xsl:text>
+ <xsl:comment>MODE: GENERATE-ID-2 </xsl:comment><xsl:text> </xsl:text>
+ <!-- repeatable-id maker from David Carlisle. -->
+ <!-- use this if you need generate IDs in separate passes,
+ because generate-id() is not guaranteed to produce the same
+ results each time. These IDs are well-formed XML NMTOKENS -->
+ <axsl:template match="/" mode="generate-id-2">U</axsl:template>
+
+ <axsl:template match="*" mode="generate-id-2" priority="2">
+ <axsl:text>U</axsl:text>
+ <axsl:number level="multiple" count="*"/>
+ </axsl:template>
+
+ <axsl:template match="node()" mode="generate-id-2">
+ <axsl:text>U.</axsl:text>
+ <axsl:number level="multiple" count="*"/>
+ <axsl:text>n</axsl:text>
+ <axsl:number count="node()"/>
+ </axsl:template>
+
+ <axsl:template match="@*" mode="generate-id-2">
+ <axsl:text>U.</axsl:text>
+ <axsl:number level="multiple" count="*"/>
+ <axsl:text>_</axsl:text>
+ <axsl:value-of select="string-length(local-name(.))"/>
+ <axsl:text>_</axsl:text>
+ <axsl:value-of select="translate(name(),':','.')"/>
+ </axsl:template>
+
+
+ <xsl:comment>Strip characters</xsl:comment>
+ <axsl:template match="text()" priority="-1" />
+
+ </xsl:template>
+
+ <xsl:template name="handle-root">
+ <!-- Process the top-level element -->
+ <axsl:template match="/">
+ <xsl:call-template name="process-root">
+ <xsl:with-param
+ name="title" select="(@id | iso:title)[last()]"/>
+ <xsl:with-param name="version" select="'iso'" />
+ <xsl:with-param name="schemaVersion" select="@schemaVersion" />
+ <xsl:with-param name="queryBinding" select="@queryBinding" />
+ <xsl:with-param name="contents">
+ <xsl:apply-templates mode="do-all-patterns"/>
+ </xsl:with-param>
+
+ <!-- "Rich" properties -->
+ <xsl:with-param name="fpi" select="@fpi"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ <xsl:with-param name="see" select="@see" />
+ <xsl:with-param name="space" select="@xml:space" />
+
+
+ <!-- Non-standard extensions not part of the API yet -->
+ <xsl:with-param name="action" select="@action" />
+ </xsl:call-template>
+ </axsl:template>
+
+
+</xsl:template>
+
+<!-- ============================================================== -->
+<!-- ISO SCHEMATRON ELEMENTS -->
+<!-- ============================================================== -->
+
+ <!-- ISO ACTIVE -->
+ <xsl:template match="iso:active">
+ <xsl:if test="not(@pattern)">
+ <xsl:message>Markup Error: no pattern attribute in <active></xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not(../../iso:pattern[@id = current()/@pattern])
+ and not(../../iso:include)">
+ <xsl:message>Reference Error: the pattern "<xsl:value-of select="@pattern"
+ />" has been activated but is not declared</xsl:message>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- ISO ASSERT and REPORT -->
+ <xsl:template match="iso:assert">
+
+ <xsl:if test="not(@test)">
+ <xsl:message>Markup Error: no test attribute in <assert</xsl:message>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <xsl:comment>ASSERT <xsl:value-of select="@role" /> </xsl:comment><xsl:text> </xsl:text>
+
+ <axsl:choose>
+ <axsl:when test="{@test}"/>
+ <axsl:otherwise>
+ <xsl:call-template name="process-assert">
+ <xsl:with-param name="test" select="normalize-space(@test)" />
+ <xsl:with-param name="diagnostics" select="@diagnostics"/>
+ <xsl:with-param name="flag" select="@flag"/>
+
+ <!-- "Rich" properties -->
+ <xsl:with-param name="fpi" select="@fpi"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ <xsl:with-param name="see" select="@see" />
+ <xsl:with-param name="space" select="@xml:space" />
+
+ <!-- "Linking" properties -->
+ <xsl:with-param name="role" select="@role" />
+ <xsl:with-param name="subject" select="@subject" />
+ </xsl:call-template>
+
+ </axsl:otherwise>
+ </axsl:choose>
+ </xsl:template>
+ <xsl:template match="iso:report">
+
+ <xsl:if test="not(@test)">
+ <xsl:message>Markup Error: no test attribute in <report></xsl:message>
+ </xsl:if>
+
+ <xsl:text> </xsl:text>
+ <xsl:comment>REPORT <xsl:value-of select="@role" /> </xsl:comment><xsl:text> </xsl:text>
+
+ <axsl:if test="{@test}">
+
+ <xsl:call-template name="process-report">
+ <xsl:with-param name="test" select="normalize-space(@test)" />
+ <xsl:with-param name="diagnostics" select="@diagnostics"/>
+ <xsl:with-param name="flag" select="@flag"/>
+
+ <!-- "Rich" properties -->
+ <xsl:with-param name="fpi" select="@fpi"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ <xsl:with-param name="see" select="@see" />
+ <xsl:with-param name="space" select="@xml:space" />
+
+ <!-- "Linking" properties -->
+ <xsl:with-param name="role" select="@role" />
+ <xsl:with-param name="subject" select="@subject" />
+ </xsl:call-template>
+
+ </axsl:if>
+ </xsl:template>
+
+
+ <!-- ISO DIAGNOSTIC -->
+ <!-- We use a mode here to maintain backwards compatability, instead of adding it
+ to the other mode.
+ -->
+ <xsl:template match="iso:diagnostic" mode="check-diagnostics">
+ <xsl:if test="not(@id)">
+ <xsl:message>Markup Error: no id attribute in <diagnostic></xsl:message>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="iso:diagnostic" >
+ <xsl:call-template name="process-diagnostic">
+
+ <!-- "Rich" properties -->
+ <xsl:with-param name="fpi" select="@fpi"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ <xsl:with-param name="see" select="@see" />
+ <xsl:with-param name="space" select="@xml:space" />
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- ISO DIAGNOSTICS -->
+ <xsl:template match="iso:diagnostics" >
+ <xsl:apply-templates mode="check-diagnostics" select="*" />
+ </xsl:template>
+
+ <!-- ISO DIR -->
+ <xsl:template match="iso:dir" mode="text" >
+ <xsl:call-template name="process-dir">
+ <xsl:with-param name="value" select="@value"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- ISO EMPH -->
+ <xsl:template match="iso:emph" mode="text">
+
+ <xsl:call-template name="process-emph"/>
+
+ </xsl:template>
+
+ <!-- ISO EXTENDS -->
+ <xsl:template match="iso:extends">
+ <xsl:if test="not(@rule)">
+ <xsl:message>Markup Error: no rule attribute in <extends></xsl:message>
+ </xsl:if>
+ <xsl:if test="not(//iso:rule[@abstract='true'][@id= current()/@rule] )">
+ <xsl:message>Reference Error: the abstract rule "<xsl:value-of select="@rule"
+ />" has been referenced but is not declared</xsl:message>
+ </xsl:if>
+ <xsl:call-template name="IamEmpty" />
+
+ <xsl:if test="//iso:rule[@id=current()/@rule]">
+ <xsl:apply-templates select="//iso:rule[@id=current()/@rule]"
+ mode="extends"/>
+ </xsl:if>
+
+ </xsl:template>
+
+ <!-- KEY: ISO has no KEY -->
+ <!-- NOTE:
+ Key has had a checkered history. Schematron 1.0 allowed it in certain places, but
+ users came up with a different location, which has now been adopted.
+
+ XT, the early XSLT processor, did not implement key and died when it was present.
+ So there are some versions of the Schematron skeleton for XT that strip out all
+ key elements.
+
+ Xalan (e.g. Xalan4C 1.0 and a Xalan4J) also had a funny. A fix involved making
+ a top-level parameter called $hiddenKey and then using that instead of matching
+ "key". This has been removed.
+ -->
+ <xsl:template match="xsl:key" mode="do-keys" >
+ <xsl:if test="not(@name)">
+ <xsl:message>Markup Error: no name attribute in <key></xsl:message>
+ </xsl:if>
+ <xsl:if test="not(@path) and not(@use)">
+ <xsl:message>Markup Error: no path or use attribute in <key></xsl:message>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="parent::iso:rule ">
+ <xsl:call-template name="IamEmpty" />
+ <xsl:choose>
+ <xsl:when test="@path">
+ <axsl:key match="{../@context}" name="{@name}" use="{@path}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <axsl:key match="{../@context}" name="{@name}" use="{@use}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="not(@match) ">
+ <xsl:message>Markup Error: no path or use attribute in <key></xsl:message>
+ </xsl:if>
+ <axsl:key>
+ <xsl:copy-of select="@*"/>
+ </axsl:key>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="xsl:key " /><!-- swallow -->
+
+ <xsl:template match="iso:key " >
+ <xsl:message>Schema error: The key element is not in the ISO Schematron namespace. Use the XSLT namespace.</xsl:message>
+ </xsl:template>
+
+ <!-- ISO INCLUDE -->
+ <!-- This is only a fallback. Include really needs to have been done before this as a separate pass.-->
+
+ <xsl:template match="iso:include[not(normalize-space(@href))]"
+ priority="1">
+ <xsl:if test=" $debug = 'false' ">
+ <xsl:message terminate="yes">Schema error: Empty href= attribute for include directive.</xsl:message>
+ </xsl:if>
+
+ </xsl:template>
+
+ <!-- Extend the URI syntax to allow # refererences -->
+ <!-- Add experimental support for simple containers like /xxx:xxx/iso:pattern to allow better includes -->
+ <xsl:template match="iso:include">
+ <xsl:variable name="document-uri" select="substring-before(concat(@href,'#'), '#')"/>
+ <xsl:variable name="fragment-id" select="substring-after(@href, '#')"/>
+
+ <xsl:choose>
+
+ <xsl:when test="string-length( $document-uri ) = 0 and string-length( $fragment-id ) = 0" >
+ <xsl:message>Error: Impossible URL in Schematron include</xsl:message>
+ </xsl:when>
+
+ <xsl:when test="string-length( $fragment-id ) > 0">
+ <xsl:variable name="theDocument_1" select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_1" select="$theDocument_1//iso:*[@id= $fragment-id ]" />
+ <xsl:if test=" $theFragment_1/self::iso:schema ">
+ <xsl:message>Schema error: Use include to include fragments, not a whole schema</xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select=" $theFragment_1"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="theDocument_2" select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_2" select="$theDocument_2/iso:*" />
+ <xsl:variable name="theContainedFragments" select="$theDocument_2/*/iso:*" />
+ <xsl:if test=" $theFragment_2/self::iso:schema or $theContainedFragments/self::iso:schema">
+ <xsl:message>Schema error: Use include to include fragments, not a whole schema</xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select="$theFragment_2 | $theContainedFragments "/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- This is to handle the particular case of including patterns -->
+ <xsl:template match="iso:include" mode="do-all-patterns">
+ <xsl:variable name="document-uri" select="substring-before(concat(@href,'#'), '#')"/>
+ <xsl:variable name="fragment-id" select="substring-after(@href, '#')"/>
+
+ <xsl:choose>
+
+ <xsl:when test="string-length( $document-uri ) = 0 and string-length( $fragment-id ) = 0" >
+ <xsl:message>Error: Impossible URL in Schematron include</xsl:message>
+ </xsl:when>
+
+ <xsl:when test="string-length( $fragment-id ) > 0">
+ <xsl:variable name="theDocument_1" select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_1" select="$theDocument_1//iso:*[@id= $fragment-id ]" />
+ <xsl:if test=" $theFragment_1/self::iso:schema ">
+ <xsl:message>Schema error: Use include to include fragments, not a whole schema</xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select=" $theFragment_1" mode="do-all-patterns"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- Import the top-level element if it is in schematron namespace,
+ or its children otherwise, to allow a simple containment mechanism. -->
+ <xsl:variable name="theDocument_2" select="document( $document-uri,/ )" />
+ <xsl:variable name="theFragment_2" select="$theDocument_2/iso:*" />
+ <xsl:variable name="theContainedFragments" select="$theDocument_2/*/iso:*" />
+ <xsl:if test=" $theFragment_2/self::iso:schema or $theContainedFragments/self::iso:schema">
+ <xsl:message>Schema error: Use include to include fragments, not a whole schema</xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select="$theFragment_2 | $theContainedFragments "
+ mode="do-all-patterns" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ISO LET -->
+ <xsl:template match="iso:let" >
+ <xsl:if test="ancestor::iso:schema[@queryBinding='xpath']">
+ <xsl:message>Warning: Variables should not be used with the "xpath" query language binding.</xsl:message>
+ </xsl:if>
+
+ <!-- lets at the top-level are implemented as parameters unless they have contents -->
+
+ <xsl:choose>
+ <!-- TODO: what about top-level lets that include data? -->
+ <xsl:when test="parent::iso:schema">
+ <!-- it is an error to have an empty param/@select because an XPath is expected -->
+ <!-- So why is the select="{@value}" still there? because the let always has a value! -->
+ <!-- TODO: remove spurious let. -->
+ <xsl:choose>
+ <xsl:when test="@value">
+ <axsl:param name="{@name}" select="{@value}">
+ <xsl:if test="string-length(@value) > 0">
+ <xsl:attribute name="select"><xsl:value-of select="@value"/></xsl:attribute>
+ </xsl:if>
+ </axsl:param>
+ </xsl:when>
+ <xsl:otherwise>
+ <axsl:variable name="{@name}" >
+ <xsl:copy-of select="child::node()" />
+ </axsl:variable>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="@value">
+ <axsl:variable name="{@name}" select="{@value}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <axsl:variable name="{@name}" >
+ <xsl:copy-of select="child::node()" />
+ </axsl:variable>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <!-- ISO NAME -->
+ <xsl:template match="iso:name" mode="text">
+
+ <xsl:if test="@path">
+ <xsl:call-template name="process-name">
+ <xsl:with-param name="name" select="concat('name(',@path,')')"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="not(@path)">
+ <xsl:call-template name="process-name">
+ <xsl:with-param name="name" select="'name(.)'"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:call-template name="IamEmpty" />
+ </xsl:template>
+
+ <!-- ISO NS -->
+ <!-- Namespace handling is XSLT is quite tricky and implementation dependent -->
+ <xsl:template match="iso:ns">
+ <xsl:call-template name="handle-namespace" />
+ </xsl:template>
+
+ <!-- This template is just to provide the API hook -->
+ <xsl:template match="iso:ns" mode="do-all-patterns" >
+ <xsl:if test="not(@uri)">
+ <xsl:message>Markup Error: no uri attribute in <ns></xsl:message>
+ </xsl:if>
+ <xsl:if test="not(@prefix)">
+ <xsl:message>Markup Error: no prefix attribute in <ns></xsl:message>
+ </xsl:if>
+ <xsl:call-template name="IamEmpty" />
+ <xsl:call-template name="process-ns" >
+ <xsl:with-param name="prefix" select="@prefix"/>
+ <xsl:with-param name="uri" select="@uri"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- ISO P -->
+ <xsl:template match="iso:schema/iso:p " mode="do-schema-p" >
+ <xsl:call-template name="process-p">
+ <xsl:with-param name="class" select="@class"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template match="iso:pattern/iso:p " mode="do-pattern-p" >
+ <xsl:call-template name="process-p">
+ <xsl:with-param name="class" select="@class"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- Currently, iso:p in other position are not passed through to the API -->
+ <xsl:template match="iso:phase/iso:p" />
+ <xsl:template match="iso:p " priority="-1" />
+
+ <!-- ISO PATTERN -->
+ <xsl:template match="iso:pattern" mode="do-all-patterns">
+ <xsl:if test="($phase = '#ALL')
+ or (../iso:phase[@id= $phase]/iso:active[@pattern= current()/@id])">
+ <xsl:call-template name="process-pattern">
+ <!-- the following select statement assumes that
+ @id | sch:title returns node-set in document order:
+ we want the title if it is there, otherwise the @id attribute -->
+ <xsl:with-param name="name" select="(@id | iso:title )[last()]"/>
+ <xsl:with-param name="is-a" select="''"/>
+
+ <!-- "Rich" properties -->
+ <xsl:with-param name="fpi" select="@fpi"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ <xsl:with-param name="see" select="@see" />
+ <xsl:with-param name="space" select="@xml:space" />
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="$select-contexts='key'">
+ <axsl:apply-templates select="key('M','M{count(preceding-sibling::*)}')" mode="M{count(preceding-sibling::*)}"/>
+ </xsl:when>
+ <xsl:when test="$select-contexts='//'">
+ <axsl:apply-templates mode="M{count(preceding-sibling::*)}">
+ <xsl:attribute name="select">
+ <xsl:text>//(</xsl:text>
+ <xsl:for-each select="iso:rule/@context">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="position()!=last()">|</xsl:if>
+ </xsl:for-each>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="$visit-text='false'">[not(self::text())]</xsl:if>
+ </xsl:attribute>
+ </axsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <axsl:apply-templates select="/" mode="M{count(preceding-sibling::*)}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="iso:pattern[@abstract='true']">
+
+ <xsl:message>Schema implementation error: This schema has abstract patterns, yet they are supposed to be preprocessed out already
+ </xsl:message>
+ </xsl:template>
+
+ <!-- Here is the template for the normal case of patterns -->
+ <xsl:template match="iso:pattern[not(@abstract='true')]">
+
+ <xsl:if test="($phase = '#ALL')
+ or (../iso:phase[@id= $phase]/iso:active[@pattern= current()/@id])">
+
+ <xsl:text> </xsl:text>
+ <xsl:comment>PATTERN <xsl:value-of select="@id" /> <xsl:value-of select="iso:title" /> </xsl:comment><xsl:text> </xsl:text>
+ <xsl:apply-templates />
+
+ <!-- DPC select-contexts test -->
+ <xsl:if test="not($select-contexts)">
+ <axsl:template match="text()" priority="-1" mode="M{count(preceding-sibling::*)}">
+ <!-- strip characters -->
+ </axsl:template>
+
+ <!-- DPC introduce context-xpath variable -->
+ <axsl:template match="@*|node()"
+ priority="-2"
+ mode="M{ count(preceding-sibling::*) }">
+ <axsl:apply-templates select="{$context-xpath}" mode="M{count(preceding-sibling::*)}"/>
+ </axsl:template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- ISO PHASE -->
+ <xsl:template match="iso:phase" >
+ <xsl:if test="not(@id)">
+ <xsl:message>Markup Error: no id attribute in <phase></xsl:message>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- ISO RULE -->
+ <xsl:template match="iso:rule[not(@abstract='true')] ">
+ <xsl:if test="not(@context)">
+ <xsl:message>Markup Error: no context attribute in <rule></xsl:message>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <xsl:comment>RULE <xsl:value-of select="@id" /> </xsl:comment><xsl:text> </xsl:text>
+ <xsl:if test="iso:title">
+ <xsl:comment><xsl:value-of select="iso:title" /></xsl:comment>
+ </xsl:if>
+ <!-- DPC select-contexts -->
+ <xsl:if test="$select-contexts='key'">
+ <axsl:key name="M"
+ match="{@context}"
+ use="'M{count(../preceding-sibling::*)}'"/>
+ </xsl:if>
+
+
+<!-- DPC priorities count up from 1000 not down from 4000 (templates in same priority order as before) -->
+ <axsl:template match="{@context}"
+ priority="{1000 + count(following-sibling::*)}" mode="M{count(../preceding-sibling::*)}">
+ <xsl:call-template name="process-rule">
+ <xsl:with-param name="context" select="@context"/>
+
+ <!-- "Rich" properties -->
+ <xsl:with-param name="fpi" select="@fpi"/>
+ <xsl:with-param name="icon" select="@icon"/>
+ <xsl:with-param name="id" select="@id"/>
+ <xsl:with-param name="lang" select="@xml:lang"/>
+ <xsl:with-param name="see" select="@see" />
+ <xsl:with-param name="space" select="@xml:space" />
+
+ <!-- "Linking" properties -->
+ <xsl:with-param name="role" select="@role" />
+ <xsl:with-param name="subject" select="@subject" />
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ <!-- DPC introduce context-xpath and select-contexts variables -->
+ <xsl:if test="not($select-contexts)">
+ <axsl:apply-templates select="{$context-xpath}" mode="M{count(../preceding-sibling::*)}"/>
+ </xsl:if>
+ </axsl:template>
+ </xsl:template>
+
+
+ <!-- ISO ABSTRACT RULE -->
+ <xsl:template match="iso:rule[@abstract='true'] " >
+ <xsl:if test=" not(@id)">
+ <xsl:message>Markup Error: no id attribute on abstract <rule></xsl:message>
+ </xsl:if>
+ <xsl:if test="@context">
+ <xsl:message>Markup Error: (2) context attribute on abstract <rule></xsl:message>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="iso:rule[@abstract='true']"
+ mode="extends" >
+ <xsl:if test="@context">
+ <xsl:message>Markup Error: context attribute on abstract <rule></xsl:message>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- ISO SPAN -->
+ <xsl:template match="iso:span" mode="text">
+ <xsl:call-template name="process-span">
+ <xsl:with-param name="class" select="@class"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- ISO TITLE -->
+
+ <xsl:template match="iso:schema/iso:title" priority="1">
+ <xsl:call-template name="process-schema-title" />
+ </xsl:template>
+
+
+ <xsl:template match="iso:title" >
+ <xsl:call-template name="process-title" />
+ </xsl:template>
+
+
+ <!-- ISO VALUE-OF -->
+ <xsl:template match="iso:value-of" mode="text" >
+ <xsl:if test="not(@select)">
+ <xsl:message>Markup Error: no select attribute in <value-of></xsl:message>
+ </xsl:if>
+ <xsl:call-template name="IamEmpty" />
+
+ <xsl:choose>
+ <xsl:when test="@select">
+ <xsl:call-template name="process-value-of">
+ <xsl:with-param name="select" select="@select"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise >
+ <xsl:call-template name="process-value-of">
+ <xsl:with-param name="select" select="'.'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+
+<!-- ============================================================== -->
+<!-- DEFAULT TEXT HANDLING -->
+<!-- ============================================================== -->
+ <xsl:template match="text()" priority="-1" mode="do-keys">
+ <!-- strip characters -->
+ </xsl:template>
+ <xsl:template match="text()" priority="-1" mode="do-all-patterns">
+ <!-- strip characters -->
+ </xsl:template>
+ <xsl:template match="text()" priority="-1" mode="do-schema-p">
+ <!-- strip characters -->
+ </xsl:template>
+ <xsl:template match="text()" priority="-1" mode="do-pattern-p">
+ <!-- strip characters -->
+ </xsl:template>
+
+ <xsl:template match="text()" priority="-1">
+ <!-- Strip characters -->
+ </xsl:template>
+
+ <xsl:template match="text()" mode="text">
+ <xsl:value-of select="."/>
+ </xsl:template>
+
+ <xsl:template match="text()" mode="inline-text">
+ <xsl:value-of select="."/>
+ </xsl:template>
+
+<!-- ============================================================== -->
+<!-- UTILITY TEMPLATES -->
+<!-- ============================================================== -->
+<xsl:template name="IamEmpty">
+ <xsl:if test="count( * )">
+ <xsl:message>
+ <xsl:text>Warning: </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text> must not contain any child elements</xsl:text>
+ </xsl:message>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="diagnosticsSplit">
+ <!-- Process at the current point the first of the <diagnostic> elements
+ referred to parameter str, and then recurse -->
+ <xsl:param name="str"/>
+ <xsl:variable name="start">
+ <xsl:choose>
+ <xsl:when test="contains($str,' ')">
+ <xsl:value-of select="substring-before($str,' ')"/>
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="$str"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="end">
+ <xsl:if test="contains($str,' ')">
+ <xsl:value-of select="substring-after($str,' ')"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <!-- This works with all namespaces -->
+ <xsl:if test="not(string-length(normalize-space($start)) = 0)
+ and not(//iso:diagnostic[@id = $start])
+ and not(//sch:diagnostic[@id = $start])
+ and not(//diagnostic[@id = $start])">
+ <xsl:message>Reference error: A diagnostic "<xsl:value-of select="string($start)"
+ />" has been referenced but is not declared</xsl:message>
+ </xsl:if>
+
+ <xsl:if test="string-length(normalize-space($start)) > 0">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates
+ select="//iso:diagnostic[@id = $start ]
+ | //sch:diagnostic[@id = $start ]
+ | //diagnostic[@id= $start ]"/>
+ </xsl:if>
+
+ <xsl:if test="not($end='')">
+ <xsl:call-template name="diagnosticsSplit">
+ <xsl:with-param name="str" select="$end"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- It would be nice to use this but xsl:namespace does not
+ allow a fallback -->
+<!--xsl:template name="handle-namespace" version="2.0">
+ <xsl:namespace name="{@prefix}" select="@uri">
+</xsl:template-->
+
+<xsl:template name="handle-namespace">
+ <!-- experimental code from http://eccnet.eccnet.com/pipermail/schematron-love-in/2006-June/000104.html -->
+ <!-- Handle namespaces differently for exslt systems, msxml, and default, only using XSLT1 syntax -->
+ <!-- For more info see http://fgeorges.blogspot.com/2007/01/creating-namespace-nodes-in-xslt-10.html -->
+ <xsl:choose>
+ <!-- The following code works for XSLT1 -->
+ <xsl:when test="function-available('exsl:node-set')">
+ <xsl:variable name="ns-dummy-elements">
+ <xsl:element name="{@prefix}:dummy" namespace="{@uri}"/>
+ </xsl:variable>
+ <xsl:variable name="p" select="@prefix"/>
+ <xsl:copy-of select="exsl:node-set($ns-dummy-elements)
+ /*/namespace::*[local-name()=$p]"/>
+ </xsl:when>
+
+ <!-- End XSLT1 code -->
+
+ <!-- Not tested yet
+ <xsl:when test="function-available('msxsl:node-set')">
+ <xsl:variable name="ns-dummy-elements">
+ <xsl:element name="{ $prefix }:e" namespace="{ $uri }"/>
+ </xsl:variable>
+ <xsl:copy-of select="msxsl:node-set($ns-dummy-elements)/*/namespace::*"/>
+ </xsl:when>
+ -->
+
+ <xsl:when test="@prefix = 'xsl' ">
+ <!-- Do not generate dummy attributes with the xsl: prefix, as these
+ are errors against XSLT, because we presume that the output
+ stylesheet uses the xsl prefix. In any case, there would already
+ be a namespace declaration for the XSLT namespace generated
+ automatically, presumably using "xsl:".
+ -->
+ </xsl:when>
+
+ <xsl:when test="@uri = 'http://www.w3.org/1999/XSL/Transform'">
+ <xsl:message terminate="yes">
+ <xsl:text>Using the XSLT namespace with a prefix other than "xsl" in </xsl:text>
+ <xsl:text>Schematron rules is not supported </xsl:text>
+ <xsl:text>in this processor: </xsl:text>
+ <xsl:value-of select="system-property('xsl:vendor')"/>
+ </xsl:message>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:attribute name="{concat(@prefix,':dummy-for-xmlns')}" namespace="{@uri}" />
+
+ </xsl:otherwise>
+ </xsl:choose>
+
+
+</xsl:template>
+
+<!-- ============================================================== -->
+<!-- UNEXPECTED ELEMENTS -->
+<!-- ============================================================== -->
+
+ <xsl:template match="iso:*" priority="-2">
+ <xsl:message>
+ <xsl:text>Error: unrecognized element in ISO Schematron namespace: check spelling
+ and capitalization</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ </xsl:message>
+ </xsl:template>
+
+
+ <!-- Swallow old namespace elements: there is an upfront test for them elsewhere -->
+ <xsl:template match="sch:*" priority="-2" />
+
+ <xsl:template match="*" priority="-3">
+ <xsl:choose>
+ <xsl:when test=" $allow-foreign = 'false' ">
+ <xsl:message>
+ <xsl:text>Warning: unrecognized element </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="." />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="iso:*" mode="text" priority="-2" />
+ <xsl:template match="*" mode="text" priority="-3">
+ <xsl:choose>
+ <xsl:when test=" $allow-foreign = 'false' ">
+ <xsl:message>
+ <xsl:text>Warning: unrecognized element </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="." />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+<!-- ============================================================== -->
+<!-- DEFAULT NAMED TEMPLATES -->
+<!-- These are the actions that are performed unless overridden -->
+<!-- ============================================================== -->
+
+ <xsl:template name="process-prolog"/>
+ <!-- no params -->
+
+ <xsl:template name="process-root">
+ <xsl:param name="contents"/>
+ <xsl:param name="id" />
+ <xsl:param name="version" />
+ <xsl:param name="schemaVersion" />
+ <xsl:param name="queryBinding" />
+ <xsl:param name="title" />
+
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+
+ <xsl:copy-of select="$contents"/>
+ </xsl:template>
+
+ <xsl:template name="process-assert">
+
+ <xsl:param name="test"/>
+ <xsl:param name="diagnostics" />
+ <xsl:param name="id" />
+ <xsl:param name="flag" />
+
+ <!-- "Linkable" parameters -->
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+
+
+ <xsl:call-template name="process-message">
+ <xsl:with-param name="pattern" select="$test"/>
+ <xsl:with-param name="role" select="$role"/>
+ </xsl:call-template>
+
+
+ <xsl:if test=" $terminate = 'yes' or $terminate = 'true' ">
+ <axsl:message terminate="yes">TERMINATING</axsl:message>
+ </xsl:if>
+ <xsl:if test=" $terminate = 'assert' ">
+ <axsl:message terminate="yes">TERMINATING</axsl:message>
+ </xsl:if>
+
+ </xsl:template>
+
+ <xsl:template name="process-report">
+ <xsl:param name="test"/>
+ <xsl:param name="diagnostics" />
+ <xsl:param name="id" />
+ <xsl:param name="flag" />
+
+ <!-- "Linkable" parameters -->
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+
+ <xsl:call-template name="process-message">
+ <xsl:with-param name="pattern" select="$test"/>
+ <xsl:with-param name="role" select="$role"/>
+ </xsl:call-template>
+
+
+ <xsl:if test=" $terminate = 'yes' or $terminate = 'true' ">
+ <axsl:message terminate="yes">TERMINATING</axsl:message>
+ </xsl:if>
+
+ </xsl:template>
+
+ <xsl:template name="process-diagnostic">
+ <xsl:param name="id" />
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="text"/>
+ <axsl:text> </axsl:text>
+ </xsl:template>
+
+ <xsl:template name="process-dir">
+ <xsl:param name="value" />
+
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="inline-text"/>
+ <axsl:text> </axsl:text>
+ </xsl:template>
+
+ <xsl:template name="process-emph">
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="inline-text"/>
+ <axsl:text> </axsl:text>
+ </xsl:template>
+
+ <xsl:template name="process-name">
+ <xsl:param name="name"/>
+
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <axsl:value-of select="{$name}"/>
+ <axsl:text> </axsl:text>
+
+ </xsl:template>
+
+ <xsl:template name="process-ns" >
+ <!-- Note that process-ns is for reporting. The sch:ns elements are
+ independently used in the sch:schema template to provide namespace bindings -->
+ <xsl:param name="prefix"/>
+ <xsl:param name="uri" />
+ </xsl:template>
+
+ <xsl:template name="process-p">
+ <xsl:param name="id" />
+ <xsl:param name="class" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ </xsl:template>
+
+ <xsl:template name="process-pattern">
+ <xsl:param name="id" />
+ <xsl:param name="name" />
+ <xsl:param name="is-a" />
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ </xsl:template>
+
+
+ <xsl:template name="process-rule">
+ <xsl:param name="context" />
+
+ <xsl:param name="id" />
+ <xsl:param name="flag" />
+
+ <!-- "Linkable" parameters -->
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ </xsl:template>
+
+ <xsl:template name="process-span" >
+ <xsl:param name="class" />
+
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="inline-text"/>
+ <axsl:text> </axsl:text>
+ </xsl:template>
+
+ <xsl:template name="process-title" >
+ <xsl:param name="class" />
+ <xsl:call-template name="process-p">
+ <xsl:with-param name="class">title</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="process-schema-title" >
+ <xsl:param name="class" />
+ <xsl:call-template name="process-title">
+ <xsl:with-param name="class">schema-title</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="process-value-of">
+ <xsl:param name="select"/>
+
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <axsl:value-of select="{$select}"/>
+ <axsl:text> </axsl:text>
+ </xsl:template>
+
+ <!-- default output action: the simplest customization is to just override this -->
+ <xsl:template name="process-message">
+ <xsl:param name="pattern" />
+ <xsl:param name="role" />
+
+ <xsl:apply-templates mode="text"/>
+ <xsl:if test=" $message-newline = 'true'" >
+ <axsl:value-of select="string(' ')"/>
+ </xsl:if>
+
+ </xsl:template>
+</xsl:stylesheet>
+
+
+
--- /dev/null
+<?xml version="1.0" ?>
+<!--
+ ISO_SVRL.xsl
+
+ Implementation of Schematron Validation Report Language from ISO Schematron
+ ISO/IEC 19757 Document Schema Definition Languages (DSDL)
+ Part 3: Rule-based validation Schematron
+ Annex D: Schematron Validation Report Language
+
+ This ISO Standard is available free as a Publicly Available Specification in PDF from ISO.
+ Also see www.schematron.com for drafts and other information.
+
+ This implementation of SVRL is designed to run with the "Skeleton" implementation
+ of Schematron which Oliver Becker devised. The skeleton code provides a
+ Schematron implementation but with named templates for handling all output;
+ the skeleton provides basic templates for output using this API, but client
+ validators can be written to import the skeleton and override the default output
+ templates as required. (In order to understand this, you must understand that
+ a named template such as "process-assert" in this XSLT stylesheet overrides and
+ replaces any template with the same name in the imported skeleton XSLT file.)
+
+ The other important thing to understand in this code is that there are different
+ versions of the Schematron skeleton. These track the development of Schematron through
+ Schematron 1.5, Schematron 1.6 and now ISO Schematron. One only skeleton must be
+ imported. The code has templates for the different skeletons commented out for
+ convenience. ISO Schematron has a different namespace than Schematron 1.5 and 1.6;
+ so the ISO Schematron skeleton has been written itself with an optional import
+ statement to in turn import the Schematron 1.6 skeleton. This will allow you to
+ validate with schemas from either namespace.
+
+
+ History:
+ 2010-07-10
+ * MIT license
+ 2010-04-14
+ * Add command line parameter 'terminate' which will terminate on first failed
+ assert and (optionally) successful report.
+ 2009-03-18
+ * Fix atrribute with space "see " which generates wrong name in some processors
+ 2008-08-11
+ * RJ Fix attribute/@select which saxon allows in XSLT 1
+ 2008-08-07
+ * RJ Add output-encoding attribute to specify final encoding to use
+ * Alter allow-foreign functionality so that Schematron span, emph and dir elements make
+ it to the output, for better formatting and because span can be used to mark up
+ semantically interesting information embedded in diagnostics, which reduces the
+ need to extend SVRL itself
+ * Diagnostic-reference had an invalid attribute @id that duplicated @diagnostic: removed
+ 2008-08-06
+ * RJ Fix invalid output: svrl:diagnostic-reference is not contained in an svrl:text
+ * Output comment to SVRL file giving filename if available (from command-line parameter)
+ 2008-08-04
+ * RJ move sch: prefix to schold: prefix to prevent confusion (we want people to
+ be able to switch from old namespace to new namespace without changing the
+ sch: prefix, so it is better to keep that prefix completely out of the XSLT)
+ * Extra signature fixes (PH)
+ 2008-08-03
+ * Repair missing class parameter on process-p
+ 2008-07-31
+ * Update skeleton names
+ 2007-04-03
+ * Add option generate-fired-rule (RG)
+ 2007-02-07
+ * Prefer true|false for parameters. But allow yes|no on some old for compatability
+ * DP Diagnostics output to svrl:text. Diagnosis put out after assertion text.
+ * Removed non-SVRL elements and attributes: better handled as an extra layer that invokes this one
+ * Add more formal parameters
+ * Correct confusion between $schemaVersion and $queryBinding
+ * Indent
+ * Validate against RNC schemas for XSLT 1 and 2 (with regex tests removed)
+ * Validate output with UniversalTest.sch against RNC schema for ISO SVRL
+
+ 2007-02-01
+ * DP. Update formal parameters of overriding named templates to handle more attributes.
+ * DP. Refactor handling of rich and linkable parameters to a named template.
+
+ 2007-01-22
+ * DP change svrl:ns to svrl:ns-in-attribute-value
+ * Change default when no queryBinding from "unknown" to "xslt"
+
+ 2007-01-18:
+ * Improve documentation
+ * KH Add command-line options to generate paths or not
+ * Use axsl:attribute rather than xsl:attribute to shut XSLT2 up
+ * Add extra command-line options to pass to the iso_schematron_skeleton
+
+ 2006-12-01: iso_svrl.xsl Rick Jelliffe,
+ * update namespace,
+ * update phase handling,
+ * add flag param to process-assert and process-report & @ flag on output
+
+ 2001: Conformance1-5.xsl Rick Jelliffe,
+ * Created, using the skeleton code contributed by Oliver Becker
+-->
+<!--
+Open Source Initiative OSI - The MIT License:Licensing
+[OSI Approved License]
+
+This source code was previously available under the zlib/libpng license.
+Attribution is polite.
+
+The MIT License
+
+Copyright (c) 2004-2010 Rick Jellife and Academia Sinica Computing Centre, Taiwan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+-->
+
+
+<!-- Ideas nabbed from schematrons by Francis N., Miloslav N. and David C. -->
+
+<!-- The command-line parameters are:
+ phase NMTOKEN | "#ALL" (default) Select the phase for validation
+ allow-foreign "true" | "false" (default) Pass non-Schematron elements and rich markup to the generated stylesheet
+ diagnose= true | false|yes|no Add the diagnostics to the assertion test in reports (yes|no are obsolete)
+ generate-paths=true|false|yes|no generate the @location attribute with XPaths (yes|no are obsolete)
+ sch.exslt.imports semi-colon delimited string of filenames for some EXSLT implementations
+ optimize "visit-no-attributes" Use only when the schema has no attributes as the context nodes
+ generate-fired-rule "true"(default) | "false" Generate fired-rule elements
+ terminate= yes | no | true | false | assert Terminate on the first failed assertion or successful report
+ Note: whether any output at all is generated depends on the XSLT implementation.
+-->
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias"
+ xmlns:schold="http://www.ascc.net/xml/schematron"
+ xmlns:iso="http://purl.oclc.org/dsdl/schematron"
+ xmlns:svrl="http://purl.oclc.org/dsdl/svrl"
+>
+
+<!-- Select the import statement and adjust the path as
+ necessary for your system.
+ If not XSLT2 then also remove svrl:active-pattern/@document="{document-uri()}" from process-pattern()
+-->
+<!--
+<xsl:import href="iso_schematron_skeleton_for_saxon.xsl"/>
+-->
+
+<xsl:import href="iso_schematron_skeleton_for_xslt1.xsl"/>
+ <!--
+<xsl:import href="iso_schematron_skeleton.xsl"/>
+<xsl:import href="skeleton1-5.xsl"/>
+<xsl:import href="skeleton1-6.xsl"/>
+-->
+
+<xsl:param name="diagnose" >true</xsl:param>
+<xsl:param name="phase" >
+ <xsl:choose>
+ <!-- Handle Schematron 1.5 and 1.6 phases -->
+ <xsl:when test="//schold:schema/@defaultPhase">
+ <xsl:value-of select="//schold:schema/@defaultPhase"/>
+ </xsl:when>
+ <!-- Handle ISO Schematron phases -->
+ <xsl:when test="//iso:schema/@defaultPhase">
+ <xsl:value-of select="//iso:schema/@defaultPhase"/>
+ </xsl:when>
+ <xsl:otherwise>#ALL</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="allow-foreign" >false</xsl:param>
+<xsl:param name="generate-paths" >true</xsl:param>
+<xsl:param name="generate-fired-rule" >true</xsl:param>
+<xsl:param name="optimize"/>
+
+<xsl:param name="output-encoding" ></xsl:param>
+
+<!-- e.g. saxon file.xml file.xsl "sch.exslt.imports=.../string.xsl;.../math.xsl" -->
+<xsl:param name="sch.exslt.imports" />
+
+
+
+<!-- Experimental: If this file called, then must be generating svrl -->
+<xsl:variable name="svrlTest" select="true()" />
+
+
+
+<!-- ================================================================ -->
+
+<xsl:template name="process-prolog">
+ <axsl:output method="xml" omit-xml-declaration="no" standalone="yes"
+ indent="yes">
+ <xsl:if test=" string-length($output-encoding) > 0">
+ <xsl:attribute name="encoding"><xsl:value-of select=" $output-encoding" /></xsl:attribute>
+ </xsl:if>
+ </axsl:output>
+
+</xsl:template>
+
+<!-- Overrides skeleton.xsl -->
+<xsl:template name="process-root">
+ <xsl:param name="title"/>
+ <xsl:param name="contents" />
+ <xsl:param name="queryBinding" >xslt1</xsl:param>
+ <xsl:param name="schemaVersion" />
+ <xsl:param name="id" />
+ <xsl:param name="version"/>
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+
+ <svrl:schematron-output title="{$title}" schemaVersion="{$schemaVersion}" >
+ <xsl:if test=" string-length( normalize-space( $phase )) > 0 and
+ not( normalize-space( $phase ) = '#ALL') ">
+ <axsl:attribute name="phase">
+ <xsl:value-of select=" $phase " />
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test=" $allow-foreign = 'true'">
+ </xsl:if>
+ <xsl:if test=" $allow-foreign = 'true'">
+
+ <xsl:call-template name='richParms'>
+ <xsl:with-param name="fpi" select="$fpi" />
+ <xsl:with-param name="icon" select="$icon"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="see" select="$see" />
+ <xsl:with-param name="space" select="$space" />
+ </xsl:call-template>
+ </xsl:if>
+
+ <axsl:comment><axsl:value-of select="$archiveDirParameter"/>  
+ <axsl:value-of select="$archiveNameParameter"/>  
+ <axsl:value-of select="$fileNameParameter"/>  
+ <axsl:value-of select="$fileDirParameter"/></axsl:comment>
+
+
+ <xsl:apply-templates mode="do-schema-p" />
+ <xsl:copy-of select="$contents" />
+ </svrl:schematron-output>
+</xsl:template>
+
+
+<xsl:template name="process-assert">
+ <xsl:param name="test"/>
+ <xsl:param name="diagnostics" />
+ <xsl:param name="id" />
+ <xsl:param name="flag" />
+ <!-- "Linkable" parameters -->
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ <svrl:failed-assert test="{$test}" >
+ <xsl:if test="string-length( $id ) > 0">
+ <axsl:attribute name="id">
+ <xsl:value-of select=" $id " />
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test=" string-length( $flag ) > 0">
+ <axsl:attribute name="flag">
+ <xsl:value-of select=" $flag " />
+ </axsl:attribute>
+ </xsl:if>
+ <!-- Process rich attributes. -->
+ <xsl:call-template name="richParms">
+ <xsl:with-param name="fpi" select="$fpi"/>
+ <xsl:with-param name="icon" select="$icon"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="see" select="$see" />
+ <xsl:with-param name="space" select="$space" />
+ </xsl:call-template>
+ <xsl:call-template name='linkableParms'>
+ <xsl:with-param name="role" select="$role" />
+ <xsl:with-param name="subject" select="$subject"/>
+ </xsl:call-template>
+ <xsl:if test=" $generate-paths = 'true' or $generate-paths= 'yes' ">
+ <!-- true/false is the new way -->
+ <axsl:attribute name="location">
+ <axsl:apply-templates select="." mode="schematron-get-full-path"/>
+ </axsl:attribute>
+ </xsl:if>
+
+ <svrl:text>
+ <xsl:apply-templates mode="text" />
+
+ </svrl:text>
+ <xsl:if test="$diagnose = 'yes' or $diagnose= 'true' ">
+ <!-- true/false is the new way -->
+ <xsl:call-template name="diagnosticsSplit">
+ <xsl:with-param name="str" select="$diagnostics"/>
+ </xsl:call-template>
+ </xsl:if>
+ </svrl:failed-assert>
+
+
+ <xsl:if test=" $terminate = 'yes' or $terminate = 'true' ">
+ <axsl:message terminate="yes">TERMINATING</axsl:message>
+ </xsl:if>
+ <xsl:if test=" $terminate = 'assert' ">
+ <axsl:message terminate="yes">TERMINATING</axsl:message>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process-report">
+ <xsl:param name="id"/>
+ <xsl:param name="test"/>
+ <xsl:param name="diagnostics"/>
+ <xsl:param name="flag" />
+ <!-- "Linkable" parameters -->
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ <svrl:successful-report test="{$test}" >
+ <xsl:if test=" string-length( $id ) > 0">
+ <axsl:attribute name="id">
+ <xsl:value-of select=" $id " />
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test=" string-length( $flag ) > 0">
+ <axsl:attribute name="flag">
+ <xsl:value-of select=" $flag " />
+ </axsl:attribute>
+ </xsl:if>
+
+ <!-- Process rich attributes. -->
+ <xsl:call-template name="richParms">
+ <xsl:with-param name="fpi" select="$fpi"/>
+ <xsl:with-param name="icon" select="$icon"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="see" select="$see" />
+ <xsl:with-param name="space" select="$space" />
+ </xsl:call-template>
+ <xsl:call-template name='linkableParms'>
+ <xsl:with-param name="role" select="$role" />
+ <xsl:with-param name="subject" select="$subject"/>
+ </xsl:call-template>
+ <xsl:if test=" $generate-paths = 'yes' or $generate-paths = 'true' ">
+ <!-- true/false is the new way -->
+ <axsl:attribute name="location">
+ <axsl:apply-templates select="." mode="schematron-get-full-path"/>
+ </axsl:attribute>
+ </xsl:if>
+
+ <svrl:text>
+ <xsl:apply-templates mode="text" />
+
+ </svrl:text>
+ <xsl:if test="$diagnose = 'yes' or $diagnose='true' ">
+ <!-- true/false is the new way -->
+ <xsl:call-template name="diagnosticsSplit">
+ <xsl:with-param name="str" select="$diagnostics"/>
+ </xsl:call-template>
+ </xsl:if>
+ </svrl:successful-report>
+
+
+ <xsl:if test=" $terminate = 'yes' or $terminate = 'true' ">
+ <axsl:message terminate="yes">TERMINATING</axsl:message>
+ </xsl:if>
+</xsl:template>
+
+
+ <!-- Overrides skeleton -->
+ <xsl:template name="process-dir" >
+ <xsl:param name="value" />
+ <xsl:choose>
+ <xsl:when test=" $allow-foreign = 'true'">
+ <xsl:copy-of select="."/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="inline-text"/>
+ <axsl:text> </axsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+<xsl:template name="process-diagnostic">
+ <xsl:param name="id"/>
+ <!-- Rich parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ <svrl:diagnostic-reference diagnostic="{$id}" >
+
+ <xsl:call-template name="richParms">
+ <xsl:with-param name="fpi" select="$fpi"/>
+ <xsl:with-param name="icon" select="$icon"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="see" select="$see" />
+ <xsl:with-param name="space" select="$space" />
+ </xsl:call-template>
+<xsl:text>
+</xsl:text>
+
+ <xsl:apply-templates mode="text"/>
+
+ </svrl:diagnostic-reference>
+</xsl:template>
+
+
+ <!-- Overrides skeleton -->
+ <xsl:template name="process-emph" >
+ <xsl:param name="class" />
+ <xsl:choose>
+ <xsl:when test=" $allow-foreign = 'true'">
+ <xsl:copy-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="inline-text"/>
+ <axsl:text> </axsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+<xsl:template name="process-rule">
+ <xsl:param name="id"/>
+ <xsl:param name="context"/>
+ <xsl:param name="flag"/>
+ <!-- "Linkable" parameters -->
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ <xsl:if test=" $generate-fired-rule = 'true'">
+ <svrl:fired-rule context="{$context}" >
+ <!-- Process rich attributes. -->
+ <xsl:call-template name="richParms">
+ <xsl:with-param name="fpi" select="$fpi"/>
+ <xsl:with-param name="icon" select="$icon"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="see" select="$see" />
+ <xsl:with-param name="space" select="$space" />
+ </xsl:call-template>
+ <xsl:if test=" string( $id )">
+ <xsl:attribute name="id">
+ <xsl:value-of select=" $id " />
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test=" string-length( $role ) > 0">
+ <xsl:attribute name="role">
+ <xsl:value-of select=" $role " />
+ </xsl:attribute>
+ </xsl:if>
+ </svrl:fired-rule>
+</xsl:if>
+</xsl:template>
+
+<xsl:template name="process-ns">
+ <xsl:param name="prefix"/>
+ <xsl:param name="uri"/>
+ <svrl:ns-prefix-in-attribute-values uri="{$uri}" prefix="{$prefix}" />
+</xsl:template>
+
+<xsl:template name="process-p">
+ <xsl:param name="icon"/>
+ <xsl:param name="class"/>
+ <xsl:param name="id"/>
+ <xsl:param name="lang"/>
+
+ <svrl:text>
+ <xsl:apply-templates mode="text"/>
+ </svrl:text>
+</xsl:template>
+
+<xsl:template name="process-pattern">
+ <xsl:param name="name"/>
+ <xsl:param name="id"/>
+ <xsl:param name="is-a"/>
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ <svrl:active-pattern >
+ <xsl:if test=" string( $id )">
+ <axsl:attribute name="id">
+ <xsl:value-of select=" $id " />
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test=" string( $name )">
+ <axsl:attribute name="name">
+ <xsl:value-of select=" $name " />
+ </axsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name='richParms'>
+ <xsl:with-param name="fpi" select="$fpi"/>
+ <xsl:with-param name="icon" select="$icon"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="see" select="$see" />
+ <xsl:with-param name="space" select="$space" />
+ </xsl:call-template>
+
+ <!-- ?? report that this screws up iso:title processing -->
+ <xsl:apply-templates mode="do-pattern-p"/>
+ <!-- ?? Seems that this apply-templates is never triggered DP -->
+ <axsl:apply-templates />
+ </svrl:active-pattern>
+</xsl:template>
+
+<!-- Overrides skeleton -->
+<xsl:template name="process-message" >
+ <xsl:param name="pattern"/>
+ <xsl:param name="role"/>
+</xsl:template>
+
+
+ <!-- Overrides skeleton -->
+ <xsl:template name="process-span" >
+ <xsl:param name="class" />
+ <xsl:choose>
+ <xsl:when test=" $allow-foreign = 'true'">
+ <xsl:copy-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="inline-text"/>
+ <axsl:text> </axsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+<!-- =========================================================================== -->
+<!-- processing rich parameters. -->
+<xsl:template name='richParms'>
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ <!-- Process rich attributes. -->
+ <xsl:if test=" $allow-foreign = 'true'">
+ <xsl:if test="string($fpi)">
+ <axsl:attribute name="fpi">
+ <xsl:value-of select="$fpi"/>
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test="string($icon)">
+ <axsl:attribute name="icon">
+ <xsl:value-of select="$icon"/>
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test="string($see)">
+ <axsl:attribute name="see">
+ <xsl:value-of select="$see"/>
+ </axsl:attribute>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="string($space)">
+ <axsl:attribute name="xml:space">
+ <xsl:value-of select="$space"/>
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test="string($lang)">
+ <axsl:attribute name="xml:lang">
+ <xsl:value-of select="$lang"/>
+ </axsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<!-- processing linkable parameters. -->
+<xsl:template name='linkableParms'>
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+
+ <!-- ISO SVRL has a role attribute to match the Schematron role attribute -->
+ <xsl:if test=" string($role )">
+ <axsl:attribute name="role">
+ <xsl:value-of select=" $role " />
+ </axsl:attribute>
+ </xsl:if>
+ <!-- ISO SVRL does not have a subject attribute to match the Schematron subject attribute.
+ Instead, the Schematron subject attribute is folded into the location attribute -->
+</xsl:template>
+
+
+</xsl:stylesheet>
+
--- /dev/null
+<?xml version="1.0" ?>
+<!--
+ ISO_SVRL.xsl
+
+ Implementation of Schematron Validation Report Language from ISO Schematron
+ ISO/IEC 19757 Document Schema Definition Languages (DSDL)
+ Part 3: Rule-based validation Schematron
+ Annex D: Schematron Validation Report Language
+
+ This ISO Standard is available free as a Publicly Available Specification in PDF from ISO.
+ Also see www.schematron.com for drafts and other information.
+
+ This implementation of SVRL is designed to run with the "Skeleton" implementation
+ of Schematron which Oliver Becker devised. The skeleton code provides a
+ Schematron implementation but with named templates for handling all output;
+ the skeleton provides basic templates for output using this API, but client
+ validators can be written to import the skeleton and override the default output
+ templates as required. (In order to understand this, you must understand that
+ a named template such as "process-assert" in this XSLT stylesheet overrides and
+ replaces any template with the same name in the imported skeleton XSLT file.)
+
+ The other important thing to understand in this code is that there are different
+ versions of the Schematron skeleton. These track the development of Schematron through
+ Schematron 1.5, Schematron 1.6 and now ISO Schematron. One only skeleton must be
+ imported. The code has templates for the different skeletons commented out for
+ convenience. ISO Schematron has a different namespace than Schematron 1.5 and 1.6;
+ so the ISO Schematron skeleton has been written itself with an optional import
+ statement to in turn import the Schematron 1.6 skeleton. This will allow you to
+ validate with schemas from either namespace.
+
+
+ History:
+ 2010-07-10
+ * MIT license
+ 2010-04-14
+ * Add command line parameter 'terminate' which will terminate on first failed
+ assert and (optionally) successful report.
+ 2009-03-18
+ * Fix atrribute with space "see " which generates wrong name in some processors
+ * rename allow-foreign to allow-rich
+
+ 2009-02-19
+ * RJ add experimental non-standard attribute active-pattern/@document which says which
+ document is being validated from that point to the next similar. This is to cope with the
+ experimental multi-document validation in the XSLT2 skeleton.
+ 2008-08-19
+ * RJ Experimental: Handle property elements. NOTE: signature change for process-assert,
+ process-report and process-rule to add property.
+ 2008-08-11
+ * RJ Fix attribute/@select which saxon allows in XSLT 1
+ 2008-08-07
+ * RJ Add output-encoding attribute to specify final encoding to use
+ * Alter allow-foreign functionality so that Schematron span, emph and dir elements make
+ it to the output, for better formatting and because span can be used to mark up
+ semantically interesting information embedded in diagnostics, which reduces the
+ need to extend SVRL itself
+ * Diagnostic-reference had an invalid attribute @id that duplicated @diagnostic: removed
+ 2008-08-06
+ * RJ Fix invalid output: svrl:diagnostic-reference is not contained in an svrl:text
+ * Output comment to SVRL file giving filename if available (from command-line parameter)
+ 2008-08-04
+ * RJ move sch: prefix to schold: prefix to prevent confusion (we want people to
+ be able to switch from old namespace to new namespace without changing the
+ sch: prefix, so it is better to keep that prefix completely out of the XSLT)
+ * Extra signature fixes (PH)
+ 2008-08-03
+ * Repair missing class parameter on process-p
+ 2008-07-31
+ * Update skeleton names
+ 2007-04-03
+ * Add option generate-fired-rule (RG)
+ 2007-02-07
+ * Prefer true|false for parameters. But allow yes|no on some old for compatability
+ * DP Diagnostics output to svrl:text. Diagnosis put out after assertion text.
+ * Removed non-SVRL elements and attributes: better handled as an extra layer that invokes this one
+ * Add more formal parameters
+ * Correct confusion between $schemaVersion and $queryBinding
+ * Indent
+ * Validate against RNC schemas for XSLT 1 and 2 (with regex tests removed)
+ * Validate output with UniversalTest.sch against RNC schema for ISO SVRL
+
+ 2007-02-01
+ * DP. Update formal parameters of overriding named templates to handle more attributes.
+ * DP. Refactor handling of rich and linkable parameters to a named template.
+
+ 2007-01-22
+ * DP change svrl:ns to svrl:ns-in-attribute-value
+ * Change default when no queryBinding from "unknown" to "xslt"
+
+ 2007-01-18:
+ * Improve documentation
+ * KH Add command-line options to generate paths or not
+ * Use axsl:attribute rather than xsl:attribute to shut XSLT2 up
+ * Add extra command-line options to pass to the iso_schematron_skeleton
+
+ 2006-12-01: iso_svrl.xsl Rick Jelliffe,
+ * update namespace,
+ * update phase handling,
+ * add flag param to process-assert and process-report & @ flag on output
+
+ 2001: Conformance1-5.xsl Rick Jelliffe,
+ * Created, using the skeleton code contributed by Oliver Becker
+-->
+<!--
+Open Source Initiative OSI - The MIT License:Licensing
+[OSI Approved License]
+
+This source code was previously available under the zlib/libpng license.
+Attribution is polite.
+
+The MIT License
+
+Copyright (c) 2004-2010 Rick Jellife and Academia Sinica Computing Centre, Taiwan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+-->
+
+<!-- Ideas nabbed from schematrons by Francis N., Miloslav N. and David C. -->
+
+<!-- The command-line parameters are:
+ phase NMTOKEN | "#ALL" (default) Select the phase for validation
+ allow-foreign "true" | "false" (default) Pass non-Schematron elements and rich markup to the generated stylesheet
+ diagnose= true | false|yes|no Add the diagnostics to the assertion test in reports (yes|no are obsolete)
+ property= true | false Experimental: Add properties to the assertion test in reports
+ generate-paths=true|false|yes|no generate the @location attribute with XPaths (yes|no are obsolete)
+ sch.exslt.imports semi-colon delimited string of filenames for some EXSLT implementations
+ optimize "visit-no-attributes" Use only when the schema has no attributes as the context nodes
+ generate-fired-rule "true"(default) | "false" Generate fired-rule elements
+ terminate= yes | no | true | false | assert Terminate on the first failed assertion or successful report
+ Note: whether any output at all is generated depends on the XSLT implementation.
+-->
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias"
+ xmlns:schold="http://www.ascc.net/xml/schematron"
+ xmlns:iso="http://purl.oclc.org/dsdl/schematron"
+ xmlns:svrl="http://purl.oclc.org/dsdl/svrl"
+
+>
+
+<!-- Select the import statement and adjust the path as
+ necessary for your system.
+-->
+<xsl:import href="iso_schematron_skeleton_for_saxon.xsl"/>
+
+ <!--
+<xsl:import href="iso_schematron_skeleton_for_xslt1.xsl"/>
+
+<xsl:import href="iso_schematron_skeleton.xsl"/>
+<xsl:import href="skeleton1-5.xsl"/>
+<xsl:import href="skeleton1-6.xsl"/>
+-->
+
+<xsl:param name="diagnose">true</xsl:param>
+<xsl:param name="property">true</xsl:param>
+<xsl:param name="phase">
+ <xsl:choose>
+ <!-- Handle Schematron 1.5 and 1.6 phases -->
+ <xsl:when test="//schold:schema/@defaultPhase">
+ <xsl:value-of select="//schold:schema/@defaultPhase"/>
+ </xsl:when>
+ <!-- Handle ISO Schematron phases -->
+ <xsl:when test="//iso:schema/@defaultPhase">
+ <xsl:value-of select="//iso:schema/@defaultPhase"/>
+ </xsl:when>
+ <xsl:otherwise>#ALL</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="allow-foreign">false</xsl:param>
+<xsl:param name="generate-paths">true</xsl:param>
+<xsl:param name="generate-fired-rule">true</xsl:param>
+<xsl:param name="optimize" />
+<!-- e.g. saxon file.xml file.xsl "sch.exslt.imports=.../string.xsl;.../math.xsl" -->
+<xsl:param name="sch.exslt.imports" />
+
+<xsl:param name="terminate" >false</xsl:param>
+
+<!-- Set the language code for messages -->
+<xsl:param name="langCode">default</xsl:param>
+
+<xsl:param name="output-encoding"/>
+
+<!-- Set the default for schematron-select-full-path, i.e. the notation for svrl's @location-->
+<xsl:param name="full-path-notation">1</xsl:param>
+
+
+
+<!-- Experimental: If this file called, then must be generating svrl -->
+<xsl:variable name="svrlTest" select="true()" />
+
+
+
+<!-- ================================================================ -->
+
+<xsl:template name="process-prolog">
+ <axsl:output method="xml" omit-xml-declaration="no" standalone="yes"
+ indent="yes">
+ <xsl:if test=" string-length($output-encoding) > 0">
+ <xsl:attribute name="encoding"><xsl:value-of select=" $output-encoding" /></xsl:attribute>
+ </xsl:if>
+ </axsl:output>
+
+</xsl:template>
+
+<!-- Overrides skeleton.xsl -->
+<xsl:template name="process-root">
+ <xsl:param name="title"/>
+ <xsl:param name="contents" />
+ <xsl:param name="queryBinding" >xslt1</xsl:param>
+ <xsl:param name="schemaVersion" />
+ <xsl:param name="id" />
+ <xsl:param name="version"/>
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+
+ <svrl:schematron-output title="{$title}" schemaVersion="{$schemaVersion}" >
+ <xsl:if test=" string-length( normalize-space( $phase )) > 0 and
+ not( normalize-space( $phase ) = '#ALL') ">
+ <axsl:attribute name="phase">
+ <xsl:value-of select=" $phase " />
+ </axsl:attribute>
+ </xsl:if>
+
+ <axsl:comment><axsl:value-of select="$archiveDirParameter"/>  
+ <axsl:value-of select="$archiveNameParameter"/>  
+ <axsl:value-of select="$fileNameParameter"/>  
+ <axsl:value-of select="$fileDirParameter"/></axsl:comment>
+
+
+ <xsl:apply-templates mode="do-schema-p" />
+ <xsl:copy-of select="$contents" />
+ </svrl:schematron-output>
+</xsl:template>
+
+
+<xsl:template name="process-assert">
+ <xsl:param name="test"/>
+ <xsl:param name="diagnostics" />
+ <xsl:param name="properties" />
+ <xsl:param name="id" />
+ <xsl:param name="flag" />
+ <!-- "Linkable" parameters -->
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ <svrl:failed-assert test="{$test}" >
+ <xsl:if test="string-length( $id ) > 0">
+ <axsl:attribute name="id">
+ <xsl:value-of select=" $id " />
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test=" string-length( $flag ) > 0">
+ <axsl:attribute name="flag">
+ <xsl:value-of select=" $flag " />
+ </axsl:attribute>
+ </xsl:if>
+ <!-- Process rich attributes. -->
+ <xsl:call-template name="richParms">
+ <xsl:with-param name="fpi" select="$fpi"/>
+ <xsl:with-param name="icon" select="$icon"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="see" select="$see" />
+ <xsl:with-param name="space" select="$space" />
+ </xsl:call-template>
+ <xsl:call-template name='linkableParms'>
+ <xsl:with-param name="role" select="$role" />
+ <xsl:with-param name="subject" select="$subject"/>
+ </xsl:call-template>
+ <xsl:if test=" $generate-paths = 'true' or $generate-paths= 'yes' ">
+ <!-- true/false is the new way -->
+ <axsl:attribute name="location">
+ <axsl:apply-templates select="." mode="schematron-select-full-path"/>
+ </axsl:attribute>
+ </xsl:if>
+
+ <svrl:text>
+ <xsl:apply-templates mode="text" />
+
+ </svrl:text>
+ <xsl:if test="$diagnose = 'yes' or $diagnose= 'true' ">
+ <!-- true/false is the new way -->
+ <xsl:call-template name="diagnosticsSplit">
+ <xsl:with-param name="str" select="$diagnostics"/>
+ </xsl:call-template>
+ </xsl:if>
+
+
+ <xsl:if test="$property= 'yes' or $property= 'true' ">
+ <!-- true/false is the new way -->
+ <xsl:call-template name="propertiesSplit">
+ <xsl:with-param name="str" select="$properties"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ </svrl:failed-assert>
+
+
+ <xsl:if test=" $terminate = 'yes' or $terminate = 'true' ">
+ <axsl:message terminate="yes">TERMINATING</axsl:message>
+ </xsl:if>
+ <xsl:if test=" $terminate = 'assert' ">
+ <axsl:message terminate="yes">TERMINATING</axsl:message>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process-report">
+ <xsl:param name="id"/>
+ <xsl:param name="test"/>
+ <xsl:param name="diagnostics"/>
+ <xsl:param name="flag" />
+ <xsl:param name="properties"/>
+ <!-- "Linkable" parameters -->
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ <svrl:successful-report test="{$test}" >
+ <xsl:if test=" string-length( $id ) > 0">
+ <axsl:attribute name="id">
+ <xsl:value-of select=" $id " />
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test=" string-length( $flag ) > 0">
+ <axsl:attribute name="flag">
+ <xsl:value-of select=" $flag " />
+ </axsl:attribute>
+ </xsl:if>
+
+ <!-- Process rich attributes. -->
+ <xsl:call-template name="richParms">
+ <xsl:with-param name="fpi" select="$fpi"/>
+ <xsl:with-param name="icon" select="$icon"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="see" select="$see" />
+ <xsl:with-param name="space" select="$space" />
+ </xsl:call-template>
+ <xsl:call-template name='linkableParms'>
+ <xsl:with-param name="role" select="$role" />
+ <xsl:with-param name="subject" select="$subject"/>
+ </xsl:call-template>
+ <xsl:if test=" $generate-paths = 'yes' or $generate-paths = 'true' ">
+ <!-- true/false is the new way -->
+ <axsl:attribute name="location">
+ <axsl:apply-templates select="." mode="schematron-select-full-path"/>
+ </axsl:attribute>
+ </xsl:if>
+
+ <svrl:text>
+ <xsl:apply-templates mode="text" />
+
+ </svrl:text>
+ <xsl:if test="$diagnose = 'yes' or $diagnose='true' ">
+ <!-- true/false is the new way -->
+ <xsl:call-template name="diagnosticsSplit">
+ <xsl:with-param name="str" select="$diagnostics"/>
+ </xsl:call-template>
+ </xsl:if>
+
+
+ <xsl:if test="$property = 'yes' or $property='true' ">
+ <!-- true/false is the new way -->
+ <xsl:call-template name="propertiesSplit">
+ <xsl:with-param name="str" select="$properties"/>
+ </xsl:call-template>
+ </xsl:if>
+
+
+ </svrl:successful-report>
+
+
+ <xsl:if test=" $terminate = 'yes' or $terminate = 'true' ">
+ <axsl:message terminate="yes" >TERMINATING</axsl:message>
+ </xsl:if>
+</xsl:template>
+
+
+
+
+<xsl:template name="process-diagnostic">
+ <xsl:param name="id"/>
+ <!-- Rich parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ <svrl:diagnostic-reference diagnostic="{$id}" >
+ <!--xsl:if test="string($id)">
+ <xsl:attribute name="id">
+ <xsl:value-of select="$id"/>
+ </xsl:attribute>
+ </xsl:if-->
+ <xsl:call-template name="richParms">
+ <xsl:with-param name="fpi" select="$fpi"/>
+ <xsl:with-param name="icon" select="$icon"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="see" select="$see" />
+ <xsl:with-param name="space" select="$space" />
+ </xsl:call-template>
+<xsl:text>
+</xsl:text>
+
+ <xsl:apply-templates mode="text"/>
+
+ </svrl:diagnostic-reference>
+</xsl:template>
+
+
+ <!-- Overrides skeleton -->
+ <xsl:template name="process-dir" >
+ <xsl:param name="value" />
+ <xsl:choose>
+ <xsl:when test=" $allow-foreign = 'true'">
+ <xsl:copy-of select="."/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="inline-text"/>
+ <axsl:text> </axsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- Overrides skeleton -->
+ <xsl:template name="process-emph" >
+ <xsl:param name="class" />
+ <xsl:choose>
+ <xsl:when test=" $allow-foreign = 'true'">
+ <xsl:copy-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="inline-text"/>
+ <axsl:text> </axsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+<xsl:template name="process-rule">
+ <xsl:param name="id"/>
+ <xsl:param name="context"/>
+ <xsl:param name="flag"/>
+ <xsl:param name="properties" />
+ <!-- "Linkable" parameters -->
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ <xsl:if test=" $generate-fired-rule = 'true'">
+ <svrl:fired-rule context="{$context}" >
+ <xsl:if test=" string( $id )">
+ <xsl:attribute name="id">
+ <xsl:value-of select=" $id " />
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test=" string-length( $role ) > 0">
+ <xsl:attribute name="role">
+ <xsl:value-of select=" $role " />
+ </xsl:attribute>
+ </xsl:if>
+ <!-- Process rich attributes. -->
+ <xsl:call-template name="richParms">
+ <xsl:with-param name="fpi" select="$fpi"/>
+ <xsl:with-param name="icon" select="$icon"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="see" select="$see" />
+ <xsl:with-param name="space" select="$space" />
+ </xsl:call-template>
+
+
+ <xsl:if test="$property= 'yes' or $property= 'true' ">
+ <!-- true/false is the new way -->
+ <xsl:call-template name="propertiesSplit">
+ <xsl:with-param name="str" select="$properties"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ </svrl:fired-rule>
+</xsl:if>
+</xsl:template>
+
+<xsl:template name="process-ns">
+ <xsl:param name="prefix"/>
+ <xsl:param name="uri"/>
+ <svrl:ns-prefix-in-attribute-values uri="{$uri}" prefix="{$prefix}" />
+</xsl:template>
+
+<xsl:template name="process-p">
+ <xsl:param name="icon"/>
+ <xsl:param name="class"/>
+ <xsl:param name="id"/>
+ <xsl:param name="lang"/>
+
+ <svrl:text>
+ <xsl:apply-templates mode="text"/>
+ </svrl:text>
+</xsl:template>
+
+<xsl:template name="process-pattern">
+ <xsl:param name="name"/>
+ <xsl:param name="id"/>
+ <xsl:param name="is-a"/>
+
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ <svrl:active-pattern >
+ <axsl:attribute name="document">
+ <axsl:value-of select="document-uri(/)" />
+ </axsl:attribute><!-- If XSLT1 remove this -->
+ <xsl:if test=" string( $id )">
+ <axsl:attribute name="id">
+ <xsl:value-of select=" $id " />
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test=" string( $name )">
+ <axsl:attribute name="name">
+ <xsl:value-of select=" $name " />
+ </axsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name='richParms'>
+ <xsl:with-param name="fpi" select="$fpi"/>
+ <xsl:with-param name="icon" select="$icon"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="see" select="$see" />
+ <xsl:with-param name="space" select="$space" />
+ </xsl:call-template>
+
+ <!-- ?? report that this screws up iso:title processing -->
+ <xsl:apply-templates mode="do-pattern-p"/>
+ <!-- ?? Seems that this apply-templates is never triggered DP -->
+ <axsl:apply-templates />
+ </svrl:active-pattern>
+</xsl:template>
+
+<!-- Overrides skeleton -->
+<xsl:template name="process-message" >
+ <xsl:param name="pattern"/>
+ <xsl:param name="role"/>
+</xsl:template>
+
+
+ <!-- Overrides skeleton -->
+ <xsl:template name="process-span" >
+ <xsl:param name="class" />
+ <xsl:choose>
+ <xsl:when test=" $allow-foreign = 'true'">
+ <xsl:copy-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- We generate too much whitespace rather than risking concatenation -->
+ <axsl:text> </axsl:text>
+ <xsl:apply-templates mode="inline-text"/>
+ <axsl:text> </axsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+<!-- =========================================================================== -->
+<!-- processing rich parameters. -->
+<xsl:template name='richParms'>
+ <!-- "Rich" parameters -->
+ <xsl:param name="fpi" />
+ <xsl:param name="icon" />
+ <xsl:param name="lang" />
+ <xsl:param name="see" />
+ <xsl:param name="space" />
+ <!-- Process rich attributes. -->
+ <xsl:if test=" $allow-foreign = 'true'">
+ <xsl:if test="string($fpi)">
+ <axsl:attribute name="fpi">
+ <xsl:value-of select="$fpi "/>
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test="string($icon)">
+ <axsl:attribute name="icon">
+ <xsl:value-of select="$icon"/>
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test="string($see)">
+ <axsl:attribute name="see">
+ <xsl:value-of select="$see" />
+ </axsl:attribute>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="string($space)">
+ <axsl:attribute name="xml:space">
+ <xsl:value-of select="$space"/>
+ </axsl:attribute>
+ </xsl:if>
+ <xsl:if test="string($lang)">
+ <axsl:attribute name="xml:lang">
+ <xsl:value-of select="$lang"/>
+ </axsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<!-- processing linkable parameters. -->
+<xsl:template name='linkableParms'>
+ <xsl:param name="role"/>
+ <xsl:param name="subject"/>
+
+ <!-- ISO SVRL has a role attribute to match the Schematron role attribute -->
+ <xsl:if test=" string($role )">
+ <axsl:attribute name="role">
+ <xsl:value-of select=" $role " />
+ </axsl:attribute>
+ </xsl:if>
+ <!-- ISO SVRL does not have a subject attribute to match the Schematron subject attribute.
+ Instead, the Schematron subject attribute is folded into the location attribute -->
+</xsl:template>
+
+
+
+ <!-- ===================================================== -->
+ <!-- Extension API: -->
+ <!-- This allows the transmission of extra attributes on -->
+ <!-- rules, asserts, reports, diagnostics. -->
+ <!-- ===================================================== -->
+
+
+<!-- Overrides skeleton EXPERIMENTAL -->
+<!-- The $contents is for static contents, the $value is for dynamic contents -->
+<xsl:template name="process-property">
+ <xsl:param name="id"/>
+ <xsl:param name="name"/>
+ <xsl:param name="value"/>
+ <xsl:param name="contents"/>
+
+ <svrl:property id="{$id}" >
+ <xsl:if test="$name">
+ <xsl:attribute name="name"><xsl:value-of select="$name"/></xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$value">
+ <xsl:attribute name="value"><xsl:value-of select="$value"/></xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$contents">
+ <xsl:copy-of select="$contents"/>
+ </xsl:if>
+
+ </svrl:property>
+</xsl:template>
+
+
+</xsl:stylesheet>
+
--- /dev/null
+<h1>ISO SCHEMATRON 2010</h1>\r
+\r
+XSLT implementation by Rick Jelliffe with assistance from members of Schematron-love-in maillist.\r
+\r
+2010-04-21\r
+\r
+Two distributions are available. One is for XSLT1 engines. \r
+The other is for XSLT2 engines, such as SAXON 9.\r
+\r
+\r
+This version of Schematron splits the process into a pipeline of several different XSLT stages.\r
+\r
+1) First, preprocess your Schematron schema with iso_dsdl_include.xsl. \r
+This is a macro processor to assemble the schema from various parts. \r
+If your schema is not in separate parts, you can skip this stage.\r
+This stage also generates error messages for some common XPath syntax problems.\r
+\r
+2) Second, preprocess the output from stage 1 with iso_abstract_expand.xsl. \r
+This is a macro processor to convert abstract patterns to real patterns. \r
+If your schema does not use abstract patterns, you can skip this\r
+stage.\r
+\r
+3) Third, compile the Schematron schema into an XSLT script. \r
+This will typically use iso_svrl_for_xslt1.xsl or iso_svrl_for_xslt2.xsl \r
+(which in turn invoke iso_schematron_skeleton_for_xslt1.xsl or iso_schematron_skeleton_for_saxon.xsl)\r
+However, other "meta-stylesheets" are also in common use; the principle of operation is the same.\r
+If your schema uses Schematron phases, supply these as command line/invocation parameters\r
+to this process.\r
+\r
+4) Fourth, run the script generated by stage 3 against the document being validated.\r
+If you are using the SVRL script, then the output of validation will be an XML document.\r
+If your schema uses Schematron parameters, supply these as command line/invocation parameters\r
+to this process. \r
+\r
+\r
+The XSLT2 distribution also features several next generation features, \r
+such as validating multiple documents. See the source code for details.\r
+\r
+Schematron assertions can be written in any language, of course; the file\r
+sch-messages-en.xhtml contains the diagnostics messages from the XSLT2 skeleton\r
+in English, and this can be used as template to localize the skeleton's\r
+error messages. Note that typically programming errors in Schematron are XPath\r
+errors, which requires localized messages from the XSLT engine.\r
+\r
+ANT\r
+---\r
+To give an example of how to process a document, here is a sample ANT task.\r
+\r
+<target name="schematron-compile-test" >\r
+\r
+ <!-- expand inclusions -->\r
+ <xslt basedir="test/schematron"\r
+ style="iso_dsdl_include.xsl" in="test.sch" out="test1.sch"> \r
+ <classpath>\r
+ <pathelement location="${lib.dir}/saxon9.jar"/>\r
+ </classpath>\r
+ </xslt>\r
+\r
+ <!-- expand abstract patterns -->\r
+ <xslt basedir="test/schematron"\r
+ style="iso_abstract_expand.xsl" in="test1.sch" out="test2.sch"> \r
+ <classpath>\r
+ <pathelement location="${lib.dir}/saxon9.jar"/>\r
+ </classpath>\r
+ </xslt>\r
+\r
+\r
+\r
+ <!-- compile it -->\r
+ <xslt basedir="test/schematron"\r
+ style="iso_svrl_for_xslt2.xsl" in="test2.sch" out="test.xsl"> \r
+ <classpath>\r
+ <pathelement location="${lib.dir}/saxon9.jar"/>\r
+ </classpath>\r
+ </xslt>\r
+ \r
+ <!-- validate -->\r
+ <xslt basedir="test/schematron"\r
+ style="test.xsl" in="instance.xml" out="instance.svrlt"> \r
+ <classpath>\r
+ <pathelement location="${lib.dir}/saxon9.jar"/>\r
+ </classpath>\r
+ </xslt>\r
+ </target>\r
+ \r
+EXTRACTION SCHEMATRON FROM XSD OR RELAX NG\r
+\r
+The following files allow extracting of embedded schematron patterns\r
+in XML Schemas or RELAX NG schemas. For details, see the at\r
+ article http://www.topologi.com/resources/schtrn_xsd_paper.html\r
+ \r
+The following files are provided:\r
+ ExtractSchFromRNG.xsl Generate a Schematron schema from patterns\r
+ embedded in a RELAX NG schema. The schema uses XSLT1. \r
+ ExtractSchFromXSD.xsl Generate a Schematron schema from patterns\r
+ embedded in a W3C XML Schemas schema. The schema uses XSLT1.\r
+ \r
+ ExtractSchFromRNG-2.xsl Generate a Schematron schema from patterns\r
+ embedded in a RELAX NG schema. The schema uses XSLT2. \r
+ ExtractSchFromXSD-2.xsl Generate a Schematron schema from patterns\r
+ embedded in a W3C XML Schemas schema. The schema uses XSLT2.\r
--- /dev/null
+<xhtml:div class="ErrorMessages" xml:lang="cs"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml" >
+ <!-- Obsahuje-li chybové hlášení dynamické informace, je rozděleno
+ do sekcí "a" a "b". Různé jazyky tak mohou dynamické informace
+ umístit s ohledem na svá gramatická pravidla. -->
+ <xhtml:p id="sch-message-1-cs">Chyba ve schématu: nalezeny elementy Schematronu ve starém i novém jmenném prostoru</xhtml:p>
+ <xhtml:p id="sch-message-2-cs">Chyba ve schématu: v atributu queryBinding použijte 'xslt'</xhtml:p>
+ <xhtml:p id="sch-message-3a-cs">Porucha: Tato implementace ISO Schematronu nefunguje se schématy, která používají dotazovací jazyk</xhtml:p>
+ <xhtml:p id="sch-message-3b-cs"/>
+ <xhtml:p id="sch-message-4a-cs">Fázová chyba: fáze jménem </xhtml:p>
+ <xhtml:p id="sch-message-4b-cs"> není definována.</xhtml:p>
+ <xhtml:p id="sch-message-5-cs">Chybný markup: v elementu <active> chybí atribut pattern</xhtml:p>
+ <xhtml:p id="sch-message-6a-cs">Chybný odkaz: vzor "</xhtml:p>
+ <xhtml:p id="sch-message-6b-cs">" byl aktivován, ne však deklarován</xhtml:p>
+ <xhtml:p id="sch-message-7-cs">Chybný markup: v elementu <assert> chybí atribut test</xhtml:p>
+ <xhtml:p id="sch-message-8-cs">Chybný markup: v elementu <report> chybí atribut test</xhtml:p>
+ <xhtml:p id="sch-message-9-cs">Chybný markup: v elementu <diagnostic> chybí atribut id</xhtml:p>
+ <xhtml:p id="sch-message-10-cs">Chybný markup: v elementu <extends> chybí atribut rule</xhtml:p>
+ <xhtml:p id="sch-message-11a-cs">Chybný odkaz: abstraktní pravidlo "</xhtml:p>
+ <xhtml:p id="sch-message-11b-cs">" není definováno, ačkoli se na ně odkazuje</xhtml:p>
+ <xhtml:p id="sch-message-12-cs">Chybný markup: v elementu <key> chybí atribut name</xhtml:p>
+ <xhtml:p id="sch-message-13-cs">Chybný markup: v elementu <key> chybí atribut path nebo use</xhtml:p>
+ <xhtml:p id="sch-message-14-cs">Chybný markup: v elementu <key> chybí atribut path nebo use</xhtml:p>
+ <xhtml:p id="sch-message-15-cs">Chyba ve schématu: element <key> není ve jmenném prostoru ISO Schematronu. Použijte jmenný prostor XSLT.</xhtml:p>
+ <xhtml:p id="sch-message-16-cs">Chybný markup: v elementu <function> chybí atribut name</xhtml:p>
+ <xhtml:p id="sch-message-17-cs">Chyba ve schématu: element <function> není ve jmenném prostoru ISO Schematronu. Použijte jmenný prostor XSLT.</xhtml:p>
+ <xhtml:p id="sch-message-18-cs">Chyba ve schématu: direktiva <include> má prázdný atribut href</xhtml:p>
+ <xhtml:p id="sch-message-19-cs">Chyba: Nesprávné URL v direktivě <include></xhtml:p>
+ <xhtml:p id="sch-message-20a-cs">Chyba: Nelze otevřít vkládaný soubor </xhtml:p>
+ <xhtml:p id="sch-message-20b-cs" />
+ <xhtml:p id="sch-message-21-cs">Chyba ve schématu: <include> používejte ke vkládání fragmentů, ne celého schématu</xhtml:p>
+ <xhtml:p id="sch-message-22-cs">Chyba ve schématu: Schémata XSD lze importovat pouze pokud používáte dotazovací jazyk "xslt2"</xhtml:p>
+ <xhtml:p id="sch-message-23-cs">Chyba ve schématu: element <import-schema> není ve jmenném prostoru ISO Schematronu. Použijte jmenný prostor XSLT.</xhtml:p>
+ <xhtml:p id="sch-message-24-cs">Varování: S dotazovacím jazykem "xpath" by se neměly používat proměnné</xhtml:p>
+ <xhtml:p id="sch-message-25-cs">Varování: S dotazovacím jazykem "xpath2" by se neměly používat proměnné</xhtml:p>
+ <xhtml:p id="sch-message-26-cs">Chybný markup: v elementu <ns> chybí atribut uri</xhtml:p>
+ <xhtml:p id="sch-message-27-cs">Chybný markup: v elementu <ns> chybí atribut prefix</xhtml:p>
+ <xhtml:p id="sch-message-28-cs">Chyba v implementaci schématu: toto schéma obsahuje abstraktní vzory, které však již měly být předchozím zpracováním odstraněny</xhtml:p>
+ <xhtml:p id="sch-message-29-cs">Chybný markup: v elementu <phase> chybí atribut id</xhtml:p>
+ <xhtml:p id="sch-message-30-cs">Chybný markup: v elementu <rule> chybí atribut context</xhtml:p>
+ <xhtml:p id="sch-message-31-cs">Chybný markup: v abstraktním pravidlu chybí atribut id</xhtml:p>
+ <xhtml:p id="sch-message-32-cs">Chybný markup: (2) Abstraktní pravidlo nesmí mít atribut context</xhtml:p>
+ <xhtml:p id="sch-message-33-cs">Chybný markup: Abstraktní pravidlo nesmí mít atribut context</xhtml:p>
+ <xhtml:p id="sch-message-34-cs">Chybný markup: v elementu <value-of> chybí atribut select</xhtml:p>
+ <xhtml:p id="sch-message-35a-cs">Varování: </xhtml:p>
+ <xhtml:p id="sch-message-35b-cs"> nesmí obsahovat žádné podelementy</xhtml:p>
+ <xhtml:p id="sch-message-36a-cs">Chybný odkaz: Diagnostika "</xhtml:p>
+ <xhtml:p id="sch-message-36b-cs">" nebyla deklarována, ačkoli se na ni odkazuje</xhtml:p>
+ <xhtml:p id="sch-message-37a-cs">Chyba: procesor </xhtml:p>
+ <xhtml:p id="sch-message-37b-cs"> nepodporuje použití jmenného prostoru XSLT s jiným prefixem než "xsl"</xhtml:p>
+ <xhtml:p id="sch-message-38a-cs">Chyba: neznámý element </xhtml:p>
+ <xhtml:p id="sch-message-38b-cs"> ve jmenném prostoru ISO Schematronu: zkontrolujte, je-li správně zapsán</xhtml:p>
+ <xhtml:p id="sch-message-39a-cs">Varování: neznámý element
+</xhtml:p>
+ <xhtml:p id="sch-message-39b-cs" />
+ </xhtml:div>
--- /dev/null
+<xhtml:div class="ErrorMessages" xml:lang="de" xmlns:xhtml="http://www.w3.org/1999/xhtml">\r
+ <!-- Where the error message contains dynamic information, the message has been split into an "a" and a "b" section.\r
+ This has been done even when the English does not require it, in order to accomodate different language grammars\r
+ that might position the dynamic information differently.\r
+ -->\r
+ <xhtml:p id="sch-message-1-de">Fehler im Schema: Schematron Elemente sowohl im alten als auch neuen Namensraum gefunden</xhtml:p>\r
+ <xhtml:p id="sch-message-2-de">Fehler im Schema: Nutzen Sie 'xslt' als Wert für das 'queryBinding'-Attribut</xhtml:p>\r
+ <xhtml:p id="sch-message-3a-de">Fehler: Diese Implementierung von ISO Schematron unterstützt keine Schemas, welche die Query Language </xhtml:p>\r
+ <xhtml:p id="sch-message-3b-de">nutzen</xhtml:p>\r
+ <xhtml:p id="sch-message-4a-de">Phasenfehler: Es gibt keine Phase mit Namen </xhtml:p>\r
+ <xhtml:p id="sch-message-4b-de"/>\r
+ <xhtml:p id="sch-message-5-de">Fehler in der Annotation: Kein Attribut 'pattern' in <active></xhtml:p>\r
+ <xhtml:p id="sch-message-6a-de">Referenzierungsfehler: Der Ausdruck "</xhtml:p>\r
+ <xhtml:p id="sch-message-6b-de">" wurde aktiviert, ist aber nicht deklariert</xhtml:p>\r
+ <xhtml:p id="sch-message-7-de">Fehler in der Annotation: Kein Attribut 'test' in <assert</xhtml:p>\r
+ <xhtml:p id="sch-message-8-de">Fehler in der Annotation: Kein Attribut 'test' in <report></xhtml:p>\r
+ <xhtml:p id="sch-message-9-de">Fehler in der Annotation: Kein Attribut 'id' in <diagnostic></xhtml:p>\r
+ <xhtml:p id="sch-message-10-de">Fehler in der Annotation: Kein Attribut 'rule' in <extends></xhtml:p>\r
+ <xhtml:p id="sch-message-11a-de">Referenzierungsfehler: Die abstrakte Regel "</xhtml:p>\r
+ <xhtml:p id="sch-message-11b-de">" wurde referenziert, ist aber nicht deklariert</xhtml:p>\r
+ <xhtml:p id="sch-message-12-de">Fehler in der Annotation: Kein Attribut 'name' in <key></xhtml:p>\r
+ <xhtml:p id="sch-message-13-de">Fehler in der Annotation: Kein Attribut 'path' oder 'use' in <key></xhtml:p>\r
+ <xhtml:p id="sch-message-14-de">Fehler in der Annotation: Kein Attribut 'path' oder 'use' in <key></xhtml:p>\r
+ <xhtml:p id="sch-message-15-de">Fehler im Schema: Das Element <key> ist im ISO Schematron-Namensraum nicht vorhanden. Benutzen Sie den XSLT-Namensraum.</xhtml:p>\r
+ <xhtml:p id="sch-message-16-de">Fehler in der Annotation: Kein Attribut 'name' in <function></xhtml:p>\r
+ <xhtml:p id="sch-message-17-de">Fehler im Schema: Das Element <function> ist im ISO Schematron-Namensraum nicht vorhanden. Benutzen Sie den XSLT-Namensraum.</xhtml:p>\r
+ <xhtml:p id="sch-message-18-de">Fehler im Schema: Leeres Attribut 'href' für <include> Anweisung.</xhtml:p>\r
+ <xhtml:p id="sch-message-19-de">Fehler: Ungültige URL in <include></xhtml:p>\r
+ <xhtml:p id="sch-message-20a-de">Kann die referenzierte Datei nicht öffnen: </xhtml:p>\r
+ <xhtml:p id="sch-message-20b-de"/>\r
+ <xhtml:p id="sch-message-21-de">Fehler im Schema: <include> darf nur zur Einbettung von Schemafragmenten genutzt werden, nicht für ganze Schemata</xhtml:p>\r
+ <xhtml:p id="sch-message-22-de">Fehler im Schema: XSD Schemata dürfen nur importiert werden, wenn das 'xslt2' Query Language Binding genutzt wird</xhtml:p>\r
+ <xhtml:p id="sch-message-23-de">Fehler im Schema: Das Element <import-schema> ist im ISO Schematron-Namensraum nicht vorhanden. Benutzen Sie den XSLT-Namensraum.</xhtml:p>\r
+ <xhtml:p id="sch-message-24-de">Warnung: Variablen sollten nicht zusammen mit dem 'xpath' Query Language Binding genutzt werden.</xhtml:p>\r
+ <xhtml:p id="sch-message-25-de">Warnung: Variablen sollten nicht zusammen mit dem 'xpath2' Query Language Binding genutzt werden.</xhtml:p>\r
+ <xhtml:p id="sch-message-26-de">Fehler in der Annotation: Fehlendes Attribut 'uri' in <ns></xhtml:p>\r
+ <xhtml:p id="sch-message-27-de">Fehler in der Annotation: Fehlendes Attribut 'prefix' in <ns></xhtml:p>\r
+ <xhtml:p id="sch-message-28-de">Fehler bei der Schemaimplementierung: Dieses Schema enthält abstrakte Mustervergleiche, die bereits vorverarbeitet sein sollten.</xhtml:p>\r
+ <xhtml:p id="sch-message-29-de">Fehler in der Annotation: Fehlendes Attribut 'id' in <phase></xhtml:p>\r
+ <xhtml:p id="sch-message-30-de">Fehler in der Annotation: Fehlendes Attribut 'context' in <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-31-de">Fehler in der Annotation: Fehlendes Attribut 'id' an abstrakter <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-32-de">Fehler in der Annotation: (2) Kontext-Attribut an abstrakter <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-33-de">Fehler in der Annotation: Attribut 'context' an abstrakter <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-34-de">Fehler in der Annotation: Fehlendes Attribut 'select' in <value-of></xhtml:p>\r
+ <xhtml:p id="sch-message-35a-de">Warnung: </xhtml:p>\r
+ <xhtml:p id="sch-message-35b-de"> darf keine Kindelemente beinhalten</xhtml:p>\r
+ <xhtml:p id="sch-message-36a-de">Referenzierungsfehler: Ein <diagnostic>-Element "</xhtml:p>\r
+ <xhtml:p id="sch-message-36b-de">" wurde referenziert, ist aber nicht deklariert</xhtml:p>\r
+ <xhtml:p id="sch-message-37a-de">Der Gebrauch des XSLT-Namensraums mit einem anderen Präfix als 'xsl' in Schematron-Regeln wird von diesem Prozessor nicht unterstützt:</xhtml:p>\r
+ <xhtml:p id="sch-message-37b-de"/>\r
+ <xhtml:p id="sch-message-38a-de">Fehler: Unbekanntes Element im ISO Schematron-Namensraum: Überprüfen Sie die Schreibweise (inkl. Groß- und Kleinschreibung)</xhtml:p>\r
+ <xhtml:p id="sch-message-38b-de"/>\r
+ <xhtml:p id="sch-message-39a-de">Warnung: Unbekanntes Element </xhtml:p>\r
+ <xhtml:p id="sch-message-39b-de"/>\r
+</xhtml:div>\r
--- /dev/null
+ \r
+<xhtml:div class="ErrorMessages" xml:lang="en"\r
+ xmlns:xhtml="http://www.w3.org/1999/xhtml" > \r
+ <!-- Where the error message contains dynamic information, the message has been split into an "a" and a "b" section.\r
+ This has been done even when the English does not require it, in order to accomodate different language grammars\r
+ that might position the dynamic information differently.\r
+ -->\r
+ <xhtml:p id="sch-message-1-en">Schema error: Schematron elements in old and new namespaces found</xhtml:p>\r
+ <xhtml:p id="sch-message-2-en">Schema error: in the queryBinding attribute, use 'xslt'</xhtml:p>\r
+ <xhtml:p id="sch-message-3a-en">Fail: This implementation of ISO Schematron does not work with schemas using the query language </xhtml:p>\r
+ <xhtml:p id="sch-message-3b-en"/>\r
+ <xhtml:p id="sch-message-4a-en">Phase Error: no phase has been defined with name </xhtml:p>\r
+ <xhtml:p id="sch-message-4b-en" />\r
+ <xhtml:p id="sch-message-5-en">Markup Error: no pattern attribute in <active></xhtml:p>\r
+ <xhtml:p id="sch-message-6a-en">Reference Error: the pattern "</xhtml:p>\r
+ <xhtml:p id="sch-message-6b-en">" has been activated but is not declared</xhtml:p>\r
+ <xhtml:p id="sch-message-7-en">Markup Error: no test attribute in <assert></xhtml:p>\r
+ <xhtml:p id="sch-message-8-en">Markup Error: no test attribute in <report></xhtml:p>\r
+ <xhtml:p id="sch-message-9-en">Markup Error: no id attribute in <diagnostic></xhtml:p>\r
+ <xhtml:p id="sch-message-10-en">Markup Error: no rule attribute in <extends></xhtml:p> \r
+ <xhtml:p id="sch-message-11a-en">Reference Error: the abstract rule "</xhtml:p>\r
+ <xhtml:p id="sch-message-11b-en">" has been referenced but is not declared</xhtml:p> \r
+ <xhtml:p id="sch-message-12-en">Markup Error: no name attribute in <key></xhtml:p>\r
+ <xhtml:p id="sch-message-13-en">Markup Error: no path or use attribute in <key></xhtml:p>\r
+ <xhtml:p id="sch-message-14-en">Markup Error: no path or use attribute in <key></xhtml:p>\r
+ <xhtml:p id="sch-message-15-en">Schema error: The <key> element is not in the ISO Schematron namespace. Use the XSLT namespace.</xhtml:p>\r
+ <xhtml:p id="sch-message-16-en">Markup Error: no name attribute in <function></xhtml:p>\r
+ <xhtml:p id="sch-message-17-en">Schema error: The <function> element is not in the ISO Schematron namespace. Use the XSLT namespace.</xhtml:p>\r
+ <xhtml:p id="sch-message-18-en">Schema error: Empty href attribute for <include> directive.</xhtml:p>\r
+ <xhtml:p id="sch-message-19-en">Error: Impossible URL in Schematron <include></xhtml:p>\r
+ <xhtml:p id="sch-message-20a-en">Error: Unable to open referenced included file: </xhtml:p>\r
+ <xhtml:p id="sch-message-20b-en" />\r
+ <xhtml:p id="sch-message-21-en">Schema error: Use <include> to include fragments, not a whole schema</xhtml:p>\r
+ <xhtml:p id="sch-message-22-en">Schema error: XSD schemas may only be imported if you are using the 'xslt2' query language binding</xhtml:p>\r
+ <xhtml:p id="sch-message-23-en">Schema error: The <import-schema> element is not available in the ISO Schematron namespace. Use the XSLT namespace.</xhtml:p>\r
+ <xhtml:p id="sch-message-24-en">Warning: Variables should not be used with the "xpath" query language binding.</xhtml:p>\r
+ <xhtml:p id="sch-message-25-en">Warning: Variables should not be used with the "xpath2" query language binding.</xhtml:p>\r
+ <xhtml:p id="sch-message-26-en">Markup Error: no uri attribute in <ns></xhtml:p>\r
+ <xhtml:p id="sch-message-27-en">Markup Error: no prefix attribute in <ns></xhtml:p>\r
+ <xhtml:p id="sch-message-28-en">Schema implementation error: This schema has abstract patterns, yet they are supposed to be preprocessed out already</xhtml:p>\r
+ <xhtml:p id="sch-message-29-en">Markup Error: no id attribute in <phase></xhtml:p>\r
+ <xhtml:p id="sch-message-30-en">Markup Error: no context attribute in <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-31-en">Markup Error: no id attribute on abstract <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-32-en">Markup Error: (2) context attribute on abstract <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-33-en">Markup Error: context attribute on abstract <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-34-en">Markup Error: no select attribute in <value-of></xhtml:p>\r
+ <xhtml:p id="sch-message-35a-en">Warning: </xhtml:p>\r
+ <xhtml:p id="sch-message-35b-en"> must not contain any child elements</xhtml:p>\r
+ <xhtml:p id="sch-message-36a-en">Reference error: A diagnostic "</xhtml:p>\r
+ <xhtml:p id="sch-message-36b-en">" has been referenced but is not declared</xhtml:p>\r
+ <xhtml:p id="sch-message-37a-en">Warning: Using the XSLT namespace with a prefix other than "xsl" in Schematron rules is not supported in this processor:</xhtml:p>\r
+ <xhtml:p id="sch-message-37b-en" />\r
+ <xhtml:p id="sch-message-38a-en">Error: unrecognized element in ISO Schematron namespace: check spelling and capitalization</xhtml:p>\r
+ <xhtml:p id="sch-message-38b-en" />\r
+ <xhtml:p id="sch-message-39a-en">Warning: unrecognized element </xhtml:p>\r
+ <xhtml:p id="sch-message-39b-en" />\r
+ </xhtml:div>
\ No newline at end of file
--- /dev/null
+<xhtml:div class="ErrorMessages" xml:lang="fr" xmlns:xhtml="http://www.w3.org/1999/xhtml"> \r
+ <!-- Where the error message contains dynamic information, the message has been split into an "a" and a "b" section.\r
+ This has been done even when the English does not require it, in order to accomodate different language grammars\r
+ that might position the dynamic information differently.\r
+ -->\r
+ <xhtml:p id="sch-message-1-fr">Erreur de schema: éléments Schematron à la fois dans l'ancien et le nouveau namespace</xhtml:p>\r
+ <xhtml:p id="sch-message-2-fr">Erreur de schema: utilisez 'xslt' dans l'attribut queryBinding</xhtml:p>\r
+ <xhtml:p id="sch-message-3a-fr">Échec: Cette implémentation de Schematron ISO ne fonctionne pas avec des schemas utilisant le langage de query </xhtml:p>\r
+ <xhtml:p id="sch-message-3b-fr"/>\r
+ <xhtml:p id="sch-message-4a-fr">Erreur de phase: aucune phase n'a été définie avec le nom </xhtml:p>\r
+ <xhtml:p id="sch-message-4b-fr"/>\r
+ <xhtml:p id="sch-message-5-fr">Erreur de balisage: pas d'attribut pattern dans <active></xhtml:p>\r
+ <xhtml:p id="sch-message-6a-fr">Erreur de référence: le pattern "</xhtml:p>\r
+ <xhtml:p id="sch-message-6b-fr">" a été activé mais n'a pas été décalaré</xhtml:p>\r
+ <xhtml:p id="sch-message-7-fr">Erreur de balisage: pas d'attribut test dans <assert></xhtml:p>\r
+ <xhtml:p id="sch-message-8-fr">Erreur de balisage: pas d'attribut test dans <report></xhtml:p>\r
+ <xhtml:p id="sch-message-9-fr">Erreur de balisage: pas d'attribut id dans <diagnostic></xhtml:p>\r
+ <xhtml:p id="sch-message-10-fr">Erreur de balisage: pas d'attribut rule dans <extends></xhtml:p>\r
+ <xhtml:p id="sch-message-11a-fr">Erreur de référence: la règle abstraite "</xhtml:p>\r
+ <xhtml:p id="sch-message-11b-fr">" a été référencée mais pas déclarée</xhtml:p>\r
+ <xhtml:p id="sch-message-12-fr">Erreur de balisage: pas d'attribut name dans <key></xhtml:p>\r
+ <xhtml:p id="sch-message-13-fr">Erreur de balisage: pas d'attribut path ou use dans <key></xhtml:p>\r
+ <xhtml:p id="sch-message-15-fr">Erreur de schema: L'élément key n'est pas dans le namespace Schematron ISO. Utilisez le namespace XSLT.</xhtml:p>\r
+ <xhtml:p id="sch-message-16-fr">Erreur de balisage: pas d'attribut name dans <function></xhtml:p>\r
+ <xhtml:p id="sch-message-17-fr">Erreur de schema: L'élément function n'est pas dans le namespace Schematron ISO. Utilisez le namespace XSLT.</xhtml:p>\r
+ <xhtml:p id="sch-message-18-fr">Erreur de schema: Attribut href vide sur a directive include.</xhtml:p>\r
+ <xhtml:p id="sch-message-19-fr">Erreur: URL impossible dans la directive include de Schematron</xhtml:p>\r
+ <xhtml:p id="sch-message-20a-fr">Impossible d'ouvrir le fichier référencé pour l'inclusion: </xhtml:p>\r
+ <xhtml:p id="sch-message-20b-fr"/>\r
+ <xhtml:p id="sch-message-21-fr">Erreur de schema: Utilisez include pour inclure des fragments et non un schema entier</xhtml:p>\r
+ <xhtml:p id="sch-message-22-fr">Erreur de schema: Les schema XSD peuvent être importés seulement si vous utilisez the langage de query 'xslt2'</xhtml:p>\r
+ <xhtml:p id="sch-message-23-fr">Erreur de schema: L'élément import-schema n'est pas disponible dans le namespace Schematron ISO. Utilisez le namespace XSLT.</xhtml:p>\r
+ <xhtml:p id="sch-message-24-fr">Avertissement: Des variables ne devraient pas être utiliées avec le langage de query "xpath".</xhtml:p>\r
+ <xhtml:p id="sch-message-24-fr">Avertissement: Des variables ne devraient pas être utiliées avec le langage de query "xpath2".</xhtml:p>\r
+ <xhtml:p id="sch-message-26-fr">Erreur de balisage: pas d'attribut uri dans <ns></xhtml:p>\r
+ <xhtml:p id="sch-message-27-fr">Erreur de balisage: pas d'attribut prefix dans <ns></xhtml:p>\r
+ <xhtml:p id="sch-message-28-fr">Erreur d'implémentation de schema: Ce schema des patterns abstraits, bien qu'ils sont supposés avoir été préprocessés précédemment</xhtml:p>\r
+ <xhtml:p id="sch-message-29-fr">Erreur de balisage: pas d'attribut id dans <phase></xhtml:p>\r
+ <xhtml:p id="sch-message-30-fr">Erreur de balisage: pas d'attribut context dans <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-31-fr">Erreur de balisage: pas d'attribut id dans <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-32-fr">Erreur de balisage: (2) attribut context dans une <rule> abstraite</xhtml:p>\r
+ <xhtml:p id="sch-message-33-fr">Erreur de balisage: attribut context dans une <rule> abstraite</xhtml:p>\r
+ <xhtml:p id="sch-message-34-fr">Erreur de balisage: pas d'attribut select dans <value-of></xhtml:p>\r
+ <xhtml:p id="sch-message-35a-fr">Avertissement: </xhtml:p>\r
+ <xhtml:p id="sch-message-35b-fr"> ne peut contenir aucun élément enfant</xhtml:p>\r
+ <xhtml:p id="sch-message-36a-fr">Erreur de référence: Un diagnostique "</xhtml:p>\r
+ <xhtml:p id="sch-message-36b-fr">" a été référencé mais n'est pas déclaré</xhtml:p>\r
+ <xhtml:p id="sch-message-37a-fr">Utiliser the namespace XSLT avec un autre préfixe que "xsl" dans les rules Schematron n'est pas supporté par ce processor:</xhtml:p>\r
+ <xhtml:p id="sch-message-37b-fr"/>\r
+ <xhtml:p id="sch-message-38a-fr">Erreur: élément inconnu dans le namespace Schematron ISO: vérifiez l'orthographe et la casse</xhtml:p>\r
+ <xhtml:p id="sch-message-38b-fr"/>\r
+ <xhtml:p id="sch-message-39a-fr">Avertissement: élément inconnu</xhtml:p>\r
+ <xhtml:p id="sch-message-39b-fr"/>\r
+</xhtml:div>\r
--- /dev/null
+<xhtml:div class="ErrorMessages" xml:lang="ja"\r
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"> \r
+ <!--エラーメセージは動的な情報が含まれている場合、メセージは "a" と "b" のセクションに分割されています。英語が異なる動的情報の可能がある時、別の言語の文法を収容するために、それを必要しない時にも行われている。-->\r
+ <xhtml:p id="sch-message-1-ja">スキーマエラー:古い名前空間と新しい名前空間にはSchematron 要素が見つかりました。</xhtml:p>\r
+ <xhtml:p id="sch-message-2-ja">スキーマエラー:検索結合属性では、 'xslt'を使用する。</xhtml:p>\r
+ <xhtml:p id="sch-message-3a-ja">失敗: ISO Schematron の 実行 は、スキーマが検索言語を使用してできない。</xhtml:p>\r
+ <xhtml:p id="sch-message-3b-ja"/>\r
+ <xhtml:p id="sch-message-4a-ja">フェーズ エラー: フェーズは名前で定義されていない。</xhtml:p>\r
+ <xhtml:p id="sch-message-4b-ja"/>\r
+ <xhtml:p id="sch-message-5-ja">マークアップエラー: <active>にはパターンの属性がない</xhtml:p>\r
+ <xhtml:p id="sch-message-6a-ja">参照エラー: パターン が "</xhtml:p>\r
+ <xhtml:p id="sch-message-6b-ja">" 活性化されているが宣言されていない。</xhtml:p>\r
+ <xhtml:p id="sch-message-7-ja">マークアップエラー: <assert> にはtestの属性がない</xhtml:p>\r
+ <xhtml:p id="sch-message-8-ja">マークアップエラー: <report> にはtestの属性がない</xhtml:p>\r
+ <xhtml:p id="sch-message-9-ja">マークアップエラー: <diagnostic> にはidの属性がない </xhtml:p>\r
+ <xhtml:p id="sch-message-10-ja">マークアップエラー: <extends> にはruleの属性がない</xhtml:p> \r
+ <xhtml:p id="sch-message-11a-ja">参照エラー: 抽象的な規則が "</xhtml:p>\r
+ <xhtml:p id="sch-message-11b-ja">" 参照されているが宣言されていない。</xhtml:p> \r
+ <xhtml:p id="sch-message-12-ja">マークアップエラー: <key>にはnameの属性がない</xhtml:p>\r
+ <xhtml:p id="sch-message-13-ja">マークアップエラー: <key>にはpath か 又は useの 属性がない</xhtml:p>\r
+ <xhtml:p id="sch-message-14-ja">マークアップエラー: <key>には path か 又は useの 属性がない</xhtml:p>\r
+ <xhtml:p id="sch-message-15-ja">スキーマエラー: <key> の要素はISO Schematronの 名前空間にはない. XSLTの名前空間を使用する。</xhtml:p>\r
+ <xhtml:p id="sch-message-16-ja">マークアップエラー: <function>にはnameの属性がない</xhtml:p>\r
+ <xhtml:p id="sch-message-17-ja">スキーマエラー: <function> の要素はISO Schematronの 名前空間にはない. XSLTの名前空間を使用する。</xhtml:p>\r
+ <xhtml:p id="sch-message-18-ja">スキーマエラー: <include>のために空hrefの属性がある。</xhtml:p>\r
+ <xhtml:p id="sch-message-19-ja">エラー: Schematron <include>には不可能なURL がある</xhtml:p>\r
+ <xhtml:p id="sch-message-20a-ja">エラー: 参照したファイルが含まれて、開けない : </xhtml:p>\r
+ <xhtml:p id="sch-message-20b-ja"/>\r
+ <xhtml:p id="sch-message-21-ja">スキーマエラー:全体のスキーマではなく、フラグメントを含む <include> を使用する。</xhtml:p>\r
+ <xhtml:p id="sch-message-22-ja">スキーマエラー: 'xslt2'の検索言語結合を使用している場合はXSDスキーマのみ読み込みできる。</xhtml:p>\r
+ <xhtml:p id="sch-message-23-ja">スキーマエラー:ISO Schematron の名前空間には <import-schema>の要素は無効です。 XSLTの 名前空間を使用する。</xhtml:p>\r
+ <xhtml:p id="sch-message-24-ja">注意: 変数は、"xpath" 検索言語結合を使用すべきではない。</xhtml:p>\r
+ <xhtml:p id="sch-message-25-ja">注意: 変数は、"xpath" 検索言語結合を使用すべきではない。</xhtml:p>\r
+ <xhtml:p id="sch-message-26-ja">マークアップエラー: <ns>にはuriの属性がない</xhtml:p>\r
+ <xhtml:p id="sch-message-27-ja">マークアップエラー: <ns>にはprefixの属性がない</xhtml:p>\r
+ <xhtml:p id="sch-message-28-ja">スキーマ実行 エラー: このスキーマは抽象的なパターンを持って、まだすでに前加工されることになっている。</xhtml:p>\r
+ <xhtml:p id="sch-message-29-ja">マークアップエラー: <phase>にはidの属性がない</xhtml:p>\r
+ <xhtml:p id="sch-message-30-ja">マークアップエラー: <rule>にはcontextの要素がない</xhtml:p>\r
+ <xhtml:p id="sch-message-31-ja">マークアップエラー: 抽象的な <rule>にはid属性がない。</xhtml:p>\r
+ <xhtml:p id="sch-message-32-ja">マークアップエラー: (2) 抽象的な <rule>にはcontext属性がない。</xhtml:p>\r
+ <xhtml:p id="sch-message-33-ja">マークアップエラー: 抽象的な <rule>にはcontext属性がない。</xhtml:p>\r
+ <xhtml:p id="sch-message-34-ja">マークアップエラー: <value-of>には selectの属性がない</xhtml:p>\r
+ <xhtml:p id="sch-message-35a-ja">注意: </xhtml:p>\r
+ <xhtml:p id="sch-message-35b-ja"> 子要素が含まれなくてはならない</xhtml:p>\r
+ <xhtml:p id="sch-message-36a-ja">参照エラー: 診断は "</xhtml:p>\r
+ <xhtml:p id="sch-message-36b-ja">" 参照されているが宣言されていない。</xhtml:p>\r
+ <xhtml:p id="sch-message-37a-ja">注意: Schematron規則で"xsl"以外の接頭辞 XSLT 名前空間を使用することは、このプロセサーで サーポトしていない。</xhtml:p>\r
+ <xhtml:p id="sch-message-37b-ja"/>\r
+ <xhtml:p id="sch-message-38a-ja">エラー: ISO Schematron 名前空間に不明な要素がある: 綴り字と大文字使用を確認する</xhtml:p>\r
+ <xhtml:p id="sch-message-38b-ja"/>\r
+ <xhtml:p id="sch-message-39a-ja">注意: 不明な要素</xhtml:p>\r
+ <xhtml:p id="sch-message-39b-ja"/>\r
+ </xhtml:div>\r
--- /dev/null
+ <xhtml:div class="ErrorMessages" xml:lang="nl" xmlns:xhtml="http://www.w3.org/1999/xhtml">\r
+ <!-- Where the error message contains dynamic information, the message has been split into an "a" and a "b" section.\r
+ This has been done even when the English does not require it, in order to accomodate different language grammars\r
+ that might position the dynamic information differently.\r
+ -->\r
+ <xhtml:p id="sch-message-1-nl">Schema fout: er werden Schematron elementen uit de oude en nieuwe\r
+ namespace gevonden</xhtml:p>\r
+ <xhtml:p id="sch-message-2-nl">Schema fout: gebruik 'xslt' in het queryBinding attribute</xhtml:p>\r
+ <xhtml:p id="sch-message-3a-nl">Faling: Deze implementatie van ISO Schematron werkt niet met\r
+ schemas die gebruik maken van de query language </xhtml:p>\r
+ <xhtml:p id="sch-message-3b-nl"/>\r
+ <xhtml:p id="sch-message-4a-nl">Fase fout: er is geen 'phase' gedefinieerd met naam </xhtml:p>\r
+ <xhtml:p id="sch-message-4b-nl"/>\r
+ <xhtml:p id="sch-message-5-nl">Markup fout: er is geen 'pattern' attribuut in <active></xhtml:p>\r
+ <xhtml:p id="sch-message-6a-nl">Referentie fout: het 'pattern' "</xhtml:p>\r
+ <xhtml:p id="sch-message-6b-nl">" is geactiveerd maar niet gedeclareerd</xhtml:p>\r
+ <xhtml:p id="sch-message-7-nl">Markup fout: er is geen 'test' attribuut in <assert</xhtml:p>\r
+ <xhtml:p id="sch-message-8-nl">Markup fout: er is geen 'test' attribuut in <report></xhtml:p>\r
+ <xhtml:p id="sch-message-9-nl">Markup fout: er is geen 'id' attribuut in <diagnostic></xhtml:p>\r
+ <xhtml:p id="sch-message-10-nl">Markup fout: er is geen 'rule' attribuut in <extends></xhtml:p>\r
+ <xhtml:p id="sch-message-11a-nl">Referentie fout: de abstracte regel "</xhtml:p>\r
+ <xhtml:p id="sch-message-11b-nl">" werd gerefereerd maar niet gedeclareerd</xhtml:p>\r
+ <xhtml:p id="sch-message-12-nl">Markup fout: er is geen 'name' attribuut in <key></xhtml:p>\r
+ <xhtml:p id="sch-message-13-nl">Markup fout: er is geen 'path' of 'use' attribuut in <key></xhtml:p>\r
+ <xhtml:p id="sch-message-14-nl">Markup fout: er is geen 'path' of 'use' attribuut in <key></xhtml:p>\r
+ <xhtml:p id="sch-message-15-nl">Schema fout: Het 'key' element zit niet in de ISO Schematron namespace. Gebruik de XSLT namespace.</xhtml:p>\r
+ <xhtml:p id="sch-message-16-nl">Markup fout: er is geen 'name' attribuut in <function></xhtml:p>\r
+ <xhtml:p id="sch-message-17-nl">Schema fout: Het 'function' element zit niet in de ISO Schematron namespace. Gebruik de XSLT namespace.</xhtml:p>\r
+ <xhtml:p id="sch-message-18-nl">Schema fout: Leeg 'href=' attribuut bij de include opdracht.</xhtml:p>\r
+ <xhtml:p id="sch-message-19-nl">Fout: Onmogelijke URL gebruikt bij de Schematron include</xhtml:p>\r
+ <xhtml:p id="sch-message-20a-nl">Kan de gerefereerde 'include' file niet openen: </xhtml:p>\r
+ <xhtml:p id="sch-message-20b-nl"/>\r
+ <xhtml:p id="sch-message-21-nl">Schema fout: Gebruik include om fragmenten op te nemen, niet een volledig schema</xhtml:p>\r
+ <xhtml:p id="sch-message-22-nl">Schema fout: XSD schemas kunnen enkel geïmporteerd worden indien de 'xslt2' query language binding gebruikt is</xhtml:p>\r
+ <xhtml:p id="sch-message-23-nl">Schema fout: Het 'import-schema' element is niet beschikbaar in the ISO Schematron namespace. Gebruik de XSLT namespace.</xhtml:p>\r
+ <xhtml:p id="sch-message-24-nl">Waarschuwing: Variabelen niet gebruiken met de "xpath" query language binding.</xhtml:p>\r
+ <xhtml:p id="sch-message-25-nl">Waarschuwing: Variabelen niet gebruiken met de "xpath2" query language binding.</xhtml:p>\r
+ <xhtml:p id="sch-message-26-nl">Markup fout: er is geen 'uri' attribute in <ns></xhtml:p>\r
+ <xhtml:p id="sch-message-27-nl">Markup fout: er is geen 'prefix' attribute in <ns></xhtml:p>\r
+ <xhtml:p id="sch-message-28-nl">Schema implementatie fout: Dit schema heeft abstracte patronen, die al gepreprocessed zouden moeten zijn</xhtml:p>\r
+ <xhtml:p id="sch-message-29-nl">Markup fout: er is geen 'id' attribuut in <phase></xhtml:p>\r
+ <xhtml:p id="sch-message-30-nl">Markup fout: er is geen 'context' attribuut in <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-31-nl">Markup fout: er is geen 'id' attribuut op abstracte <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-32-nl">Markup fout: (2) context attributen op abstracte <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-33-nl">Markup fout: context attribuut op abstracte <rule></xhtml:p>\r
+ <xhtml:p id="sch-message-34-nl">Markup fout: er is geen 'select' attribute in <value-of></xhtml:p>\r
+ <xhtml:p id="sch-message-35a-nl">Waarschuwing: </xhtml:p>\r
+ <xhtml:p id="sch-message-35b-nl"> mag geen kind elementen bevatten</xhtml:p>\r
+ <xhtml:p id="sch-message-36a-nl">Referentie fout: Een diagnostic "</xhtml:p>\r
+ <xhtml:p id="sch-message-36b-nl">" werd gerefereerd maar is niet gedeclareerd.</xhtml:p>\r
+ <xhtml:p id="sch-message-37a-nl">Het gebruik van de XSLT namespace met een prefix verschillend\r
+ van "xsl" in Schematron regels wordt niet ondersteund in deze processor:</xhtml:p>\r
+ <xhtml:p id="sch-message-37b-nl"/>\r
+ <xhtml:p id="sch-message-38a-nl">Fout: een niet herkend element in de ISO Schematron namespace: check spelling en hoofdlettergebruik</xhtml:p>\r
+ <xhtml:p id="sch-message-38b-nl"/>\r
+ <xhtml:p id="sch-message-39a-nl">Waarschuwing: een niet herkend element </xhtml:p>\r
+ <xhtml:p id="sch-message-39b-nl"/>\r
+</xhtml:div>\r
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">\r
+<HTML>\r
+<HEAD>\r
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">\r
+ <TITLE>The ISO Schematron Skeleton API</TITLE>\r
+ <META NAME="GENERATOR" CONTENT="OpenOffice.org 2.4 (Win32)">\r
+ <META NAME="CREATED" CONTENT="0;0">\r
+ <META NAME="CHANGED" CONTENT="20080808;2200065">\r
+</HEAD>\r
+<BODY LANG="en-AU" DIR="LTR">\r
+<H1>API for ISO Schematron Skeleton</H1>\r
+<H2><BR><BR>\r
+</H2>\r
+<P>Rick Jelliffe, 2010/04/14</P>\r
+<P>This document provides documentation on the XSLT API available in\r
+the implementation of Schematron called <TT>iso_schematron_skeleton.xsl</TT>.\r
+(available in an XSLT1 and XSLT2 version). The API makes available as\r
+much information from the schema, however there may be some edge\r
+cases where it is not exhaustive. \r
+</P>\r
+<P>The <I>skeleton</I> is an XSLT script which provides all the basic\r
+parsing and validating routines for compiling a Schematron schema\r
+into XSLT. Schematron was designed to allow many different uses, and\r
+the skeleton gives you a headstart in creating a customized\r
+implementation. You just need to write XSLT templates to override the\r
+default ones. (The program you write is sometimes called a\r
+<I>meta-stylesheet</I>.) It is the meta-stylesheet that is called\r
+as the XSLT script, not the skeleton. There are several\r
+pre-processing stages which the Schematron schema should be processed\r
+through first, to handle such things as include statements and\r
+abstract patterns. \r
+</P>\r
+<P>Phases and error reporting for problems in the schema itself are\r
+handled by the skeleton with no interaction with a “meta-stylesheet”.\r
+Note that there is no guarantee that the context node is always the\r
+element being handled: in most cases the only information available\r
+is the information in the parameters. \r
+</P>\r
+<P>For an introductory tutorial on using this API, see Bob DuCharme's\r
+<A HREF="http://www.xml.com/pub/a/2004/10/05/tr.html">Schematron 1.5:\r
+Looking Under the Hood</A> \r
+</P>\r
+<H1>Superset of API for Schematron 1.5 and 1.6</H1>\r
+<P>(This is an updated version of the API for the Schematron 1.5\r
+implementation called <TT>skeleton1-5.xsl</TT>, which in turn comes\r
+from the <I>new architecture</I> contributed by Oliver Becker for\r
+Schematron 1.3.)</P>\r
+<P>The current API contains only additions. Well-written\r
+meta-stylesheets that use the new API will be be able to run on the\r
+existing 1.5 and 1.6 skeletons. Similarly, it should be possible to\r
+upgrade the skeleton from 1.5 or 1.6 to the iso-schematron-skeleton\r
+only by correcting the import statement at the beginning of the\r
+meta-stylsheet. Additions or re-groupings from the 1.5 schema are\r
+shown in red. Deletions have overstrike.</P>\r
+<P>Mooted addition: a parameter @action which for specifying\r
+processing instructions on assertions and reports.</P>\r
+<HR>\r
+<H2><TT>process-prolog</TT></H2>\r
+<P>The <TT>process-prolog</TT> template gets called at the start of\r
+the validation session. It has no parameters. The default\r
+implementation is no action.</P>\r
+<HR>\r
+<H2><TT>process-root</TT></H2>\r
+<P>The <TT>process-root</TT> template processes the root element of\r
+the schema (which is not the same thing as the root of the document /\r
+and need not be the document element /*) .</P>\r
+<DL>\r
+ <DT><TT><I>node-list</I></TT><TT> $contents</TT> \r
+ </DT><DT>\r
+ <TT><I>string</I></TT><TT> $schemaVersion</TT> \r
+ </DT><DD>\r
+ The version of the schema, perhaps a datestamp. \r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>"xslt" | "xpath" |\r
+ "xslt2" | ...</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $queryBinding</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The query language binding. </FONT>\r
+ </DD><DT>\r
+ <TT><I>string</I></TT><TT> $title</TT> \r
+ </DT><DD>\r
+ The title of this schema \r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>"iso" | "1.5" |\r
+ "1.6" | ...</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $version</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ <FONT COLOR="#ff0000">The version of Schematron being used. </FONT>\r
+ </DD></DL>\r
+<P>\r
+Rich properties:</P>\r
+<DL>\r
+ <DT><TT><FONT COLOR="#ff0000"><I>XML SystemId</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $icon</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The URI of an icon </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>XML ID</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $id</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The unique identifier with the schema for the\r
+ </FONT><TT><FONT COLOR="#ff0000">schema</FONT></TT><FONT COLOR="#ff0000">\r
+ element. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>SGML FPI</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $fpi</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The Formal Public Identifier for this schema. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>IETF language</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $lang</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The human language used in this schema, from\r
+ xml:lang </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>URL</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $see</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">Link to documentation on WWW or file </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>"preserve" | "default"</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $space</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ <FONT COLOR="#ff0000">The value for xml:space </FONT>\r
+ </DD></DL>\r
+<P>\r
+To print the documentation paragraphs, use <TT><xsl:apply-templates\r
+mode="do-schema-p" /></TT></P>\r
+<P>To output the results, use <TT><xsl:copy-of select="$contents"\r
+/></TT></P>\r
+<HR>\r
+<H2><TT>process-assert</TT></H2>\r
+<P>The <TT>process-assert</TT> template handles asserts whose test\r
+has failed. \r
+</P>\r
+<DL>\r
+ <DT><TT><I>XPath</I></TT><TT> $test</TT> \r
+ </DT><DD>\r
+ The test \r
+ </DD><DT>\r
+ <TT><I>XML IDREFS</I></TT><TT> $diagnostics</TT> \r
+ </DT><DD>\r
+ A list of the idrefs diagnostic elements related to the current\r
+ assertion \r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>XML NMTOKEN</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $flag</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ <FONT COLOR="#ff0000">The name of a flag that becomes true because\r
+ this assertion fails. The flag is true for the document if it is\r
+ flagged true on any assertion. For compatability, this parameter\r
+ should not be used with Schematron 1.5.</FONT> \r
+ </DD></DL>\r
+<P>\r
+Rich properties:</P>\r
+<DL>\r
+ <DT><TT><FONT COLOR="#ff0000"><I>XML SystemId</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $icon</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The URI of an icon </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>XML ID</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $id</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The unique identifier with the schema for the\r
+ </FONT><TT><FONT COLOR="#ff0000">assert</FONT></TT><FONT COLOR="#ff0000">\r
+ element. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>SGML FPI</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $fpi</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The Formal Public Identifier for this\r
+ assertion. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>IETF language</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $lang</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The human language used in this assertion,\r
+ from xml:lang </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>URL</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $see</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">Link to documentation on WWW or file </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>"preserve" | "default"</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $space</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ <FONT COLOR="#ff0000">The value for xml:space </FONT>\r
+ </DD></DL>\r
+<P>\r
+Linking properties:</P>\r
+<DL>\r
+ <DT><TT><FONT COLOR="#ff0000"><I>XML NMTOKEN</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $role</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">A name for the generic role of this assertion.\r
+ The schema creator would have their own vocabulary. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>XPath</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $subject</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ <FONT COLOR="#ff0000">A path relative to the current context to some\r
+ interesting node considered the subject. </FONT>\r
+ </DD></DL>\r
+<P>\r
+To print the text contents, use <TT><xsl:apply-templates\r
+mode="text" /></TT></P>\r
+<HR>\r
+<H2><TT>process-diagnostic</TT></H2>\r
+<P>The <TT>process-diagnostic</TT> template handles diagnostic\r
+messages for <TT>assert</TT> statements that have failed and <TT>report</TT>\r
+statements that have succeeded. The diagnostics are evaluated in the\r
+context of the rule.</P>\r
+<P>Rich properties:</P>\r
+<DL>\r
+ <DT><TT><FONT COLOR="#ff0000"><I>XML SystemId</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $icon</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The URI of an icon </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>XML ID</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $id</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The unique identifier with the schema for the\r
+ </FONT><TT><FONT COLOR="#ff0000">assert</FONT></TT><FONT COLOR="#ff0000">\r
+ element. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>SGML FPI</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $fpi</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The Formal Public Identifier for this\r
+ assertion. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>IETF language</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $lang</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The human language used in this assertion,\r
+ from xml:lang </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>URL</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $see</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">Link to documentation on WWW or file </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>"preserve" | "default"</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $space</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ <FONT COLOR="#ff0000">The value for xml:space </FONT>\r
+ </DD><HR>\r
+</DL>\r
+<H2><TT>process-dir</TT></H2>\r
+<P>The <TT>process-dir</TT> template handles bi-directionality\r
+markup, which is only needed by certain human scripts such as Arabic.</P>\r
+<DL>\r
+ <DT><TT><I>"ltr" or "rtl" or ""</I></TT><TT>\r
+ $value</TT> \r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ Left-to-right or right-to-left or unspecified \r
+ </DD><HR>\r
+</DL>\r
+<H2><TT>process-emph</TT></H2>\r
+<P>The <TT>process-emph</TT> template handles the markup of\r
+emphasized text in paragraphs, assertions and diagnostics. It has no\r
+parameters.</P>\r
+<HR>\r
+<H2><TT>process-message</TT></H2>\r
+<P>The <TT>process-message</TT> handles default outputing of text.</P>\r
+<DL>\r
+ <DT><TT><I>string</I></TT><TT> $pattern</TT> \r
+ </DT><DD>\r
+ Some text that may be some kind of pattern \r
+ </DD><DT>\r
+ <TT><I>string</I></TT><TT> $role</TT> \r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ Some text that may be some kind of role \r
+ </DD><HR>\r
+</DL>\r
+<H2><TT>process-name</TT></H2>\r
+<P>The <TT>process-name</TT> templates handle name strings that can\r
+be used in assertions. <TT>asssert</TT> and <TT>report</TT> only\r
+provide <TT>name</TT> subelements rather than the more general\r
+<TT>value-of</TT> elements to encourage plain language and generic\r
+descriptions rather than specific diagnostics, for which purpose the\r
+<TT>diagnostics</TT> elements are used.</P>\r
+<DL>\r
+ <DT><TT><I>string</I></TT><TT> $name</TT> \r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ The name of the current element, or of the node specified by a <TT>name</TT>\r
+ element \r
+ </DD><HR>\r
+</DL>\r
+<H2><TT>process-ns</TT></H2>\r
+<P>The <TT>process-ns</TT> template reports on <TT>ns</TT>\r
+declarations, which are used to transmit on namespace information by\r
+the skeleton.</P>\r
+<DL>\r
+ <DT><TT><I>Namespace NCName</I></TT><TT> $prefix</TT> \r
+ </DT><DD>\r
+ The prefix of a namespace \r
+ </DD><DT>\r
+ <TT><I>XML SystemId</I></TT><TT> $uri</TT> \r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ The (internationalized) URI Reference of a namespace \r
+ </DD><HR>\r
+</DL>\r
+<H2><TT>process-p</TT></H2>\r
+<P>The <TT>process-p</TT> template handles paragraphs.</P>\r
+<DL>\r
+ <DT><TT><I>XML NMTOKEN</I></TT><TT> $class</TT> \r
+ </DT><DD>\r
+ An attribute that can be used for stylesheet style \r
+ </DD><DT>\r
+ <TT><I>XML ID</I></TT><TT> $id</TT> \r
+ </DT><DD>\r
+ The unique identifier with the schema for the <TT>p</TT> element. \r
+ </DD><DT>\r
+ <TT><I>XML SystemId</I></TT><TT> $icon</TT> \r
+ </DT><DD>\r
+ The URI of an icon \r
+ </DD><DT>\r
+ <TT><I>IETF Language</I></TT><TT> $lang</TT> \r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ The human language used in this paragraph \r
+ </DD></DL>\r
+<P>\r
+To print the text contents, use <TT><xsl:apply-templates\r
+mode="text" /></TT> \r
+</P>\r
+<HR>\r
+<H2><TT>process-pattern</TT></H2>\r
+<P>The <TT>process-pattern</TT> reports on the start of evaluation of\r
+a <TT>pattern</TT> element.</P>\r
+<DL>\r
+ <DT><TT><I>string</I></TT><TT> $name</TT> \r
+ </DT><DD>\r
+ The title of the current pattern \r
+ </DD><DT>\r
+ <TT><I>XML NCNAMES</I></TT><TT> $is-a</TT> \r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ Empty or not provided if the pattern is not derived from an abstract\r
+ pattern. Otherwise the name of the abstract pattern. A list may be\r
+ used if there was a sequence of abstract patterns. \r
+ </DD></DL>\r
+<P>\r
+Rich properties:</P>\r
+<DL>\r
+ <DT><TT><FONT COLOR="#ff0000"><I>XML SystemId</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $icon</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The URI of an icon </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>XML ID</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $id</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The unique identifier with the schema for the\r
+ </FONT><TT><FONT COLOR="#ff0000">pattern</FONT></TT><FONT COLOR="#ff0000">\r
+ element. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>SGML FPI</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $fpi</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The Formal Public Identifier for this pattern.\r
+ </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>IETF language</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $lang</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The human language used in this pattern, from\r
+ xml:lang </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>URL</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $see</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">A (internationalized) URI reference to some\r
+ supporting or defining documentation </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>"preserve" | "default"</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $space</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ <FONT COLOR="#ff0000">The value for xml:space </FONT>\r
+ </DD></DL>\r
+<P>\r
+To print the documentation contents, use <TT><xsl:apply-templates\r
+mode="do-pattern-p"/></TT></P>\r
+<HR>\r
+<H2><TT>process-report</TT></H2>\r
+<P>The <TT>process-report</TT> template handles <TT>report</TT> whose\r
+test has succeeded. \r
+</P>\r
+<DL>\r
+ <DT><TT><I>XPath</I></TT><TT> $test</TT> \r
+ </DT><DD>\r
+ The test \r
+ </DD><DT>\r
+ <TT><I>XML IDREFS</I></TT><TT> $diagnostics</TT> \r
+ </DT><DD>\r
+ A list of the diagnostic elements related to the current assertion \r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>XML NMTOKEN</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $flag</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ <FONT COLOR="#ff0000">The name of a flag that becomes true because\r
+ this assertion fails. The flag is true for the document if it is\r
+ flagged true on any assertion. For compatability, this parameter\r
+ should not be used with Schematron 1.5.</FONT> \r
+ </DD></DL>\r
+<P>\r
+Rich properties:</P>\r
+<DL>\r
+ <DT><TT><FONT COLOR="#ff0000"><I>XML SystemId</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $icon</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The URI of an icon </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>XML ID</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $id</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The unique identifier with the schema for the\r
+ </FONT><TT><FONT COLOR="#ff0000">report</FONT></TT><FONT COLOR="#ff0000">\r
+ element. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>SGML FPI</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $fpi</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The Formal Public Identifier for this report. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>IETF language</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $lang</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The human language used in this report, from\r
+ xml:lang </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>URL</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $see</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">Link to documentation on WWW or file </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>"preserve" | "default"</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $space</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ <FONT COLOR="#ff0000">The value for xml:space </FONT>\r
+ </DD></DL>\r
+<P>\r
+Linking properties:</P>\r
+<DL>\r
+ <DT><TT><FONT COLOR="#ff0000"><I>XML NMTOKEN</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $role</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">A name for the generic role of this assertion.\r
+ The schema creator would have their own vocabulary. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>XPath</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $subject</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ <FONT COLOR="#ff0000">A path relative to the current context to some\r
+ interesting node considered the subject. </FONT>\r
+ </DD></DL>\r
+<P>\r
+To print the text contents, use <TT><xsl:apply-templates\r
+mode="text" /></TT></P>\r
+<HR>\r
+<H2><TT>process-rule</TT></H2>\r
+<P>The <TT>process-rule</TT> reports that a <TT>rule</TT> element has\r
+fired: its <TT>context</TT> attribute matched some nodes. .</P>\r
+<DL>\r
+ <DT><TT><I>XSLT expression</I></TT><TT> $context</TT> \r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ The expression that gives the context of the current \r
+ </DD></DL>\r
+<P>\r
+Rich properties:</P>\r
+<DL>\r
+ <DT><TT><FONT COLOR="#ff0000"><I>XML SystemId</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $icon</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The URI of an icon </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>XML ID</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $id</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The unique identifier with the schema for this\r
+ </FONT><TT><FONT COLOR="#ff0000">rule</FONT></TT><FONT COLOR="#ff0000">\r
+ element. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>SGML FPI</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $fpi</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The Formal Public Identifier for this rule. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>IETF language</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $lang</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">The human language used in this rule, from\r
+ xml:lang </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>URL</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $see</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">Link to documentation on WWW or file </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>"preserve" | "default"</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $space</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ <FONT COLOR="#ff0000">The value for xml:space </FONT>\r
+ </DD></DL>\r
+<P>\r
+Linking properties:</P>\r
+<DL>\r
+ <DT><TT><FONT COLOR="#ff0000"><I>XML NMTOKEN</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $role</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD>\r
+ <FONT COLOR="#ff0000">A name for the generic role of this assertion.\r
+ The schema creator would have their own vocabulary. </FONT>\r
+ </DD><DT>\r
+ <TT><FONT COLOR="#ff0000"><I>XPath</I></FONT></TT><TT><FONT COLOR="#ff0000">\r
+ $subject</FONT></TT><FONT COLOR="#ff0000"> </FONT>\r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ <FONT COLOR="#ff0000">A path relative to the current context to some\r
+ interesting node considered the subject. </FONT>\r
+ </DD><HR>\r
+</DL>\r
+<H2><TT>process-span</TT></H2>\r
+<P>The <TT>process-span</TT> handles span elements, which are generic\r
+elements for styling, like HTML's .</P>\r
+<DL>\r
+ <DT><TT><I>XML NMTOKEN</I></TT><TT> $class</TT> \r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ An attribute that can be used for stylesheet style \r
+ </DD><HR>\r
+</DL>\r
+<H2><TT>process-title</TT></H2>\r
+<P>The <TT>process-title</TT> handles title elements, which are\r
+generic elements for styling, like HTML's .</P>\r
+<DL>\r
+ <DT><TT><I>XML NMTOKEN</I></TT><TT> $class</TT> \r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ An attribute that can be used for stylesheet style \r
+ </DD></DL>\r
+<P>\r
+By default, titles are handled by invocing <TT>process-p</TT> with\r
+the parameter class with a value "title".</P>\r
+<HR>\r
+<H2><TT>process-value-of</TT></H2>\r
+<P>The <TT>process-value-of</TT> template handles <TT>value-of</TT>\r
+elements, which are used in diagnostic messages to allow very\r
+specific hinting .</P>\r
+<DL>\r
+ <DT><TT><I>XPath</I></TT><TT> $select</TT> \r
+ </DT><DD STYLE="margin-bottom: 0.5cm">\r
+ The path of some node that will be evaluated and printed.</DD><HR>\r
+</DL>\r
+<H1>Global Parameters</H1>\r
+<P>There are several global parameters that may be available for use.\r
+However, it is not a requirement to follow these, and implementations\r
+may not supply them with any value. So a test of\r
+string-length(<I>variable</I><SPAN STYLE="font-style: normal">) <\r
+0 is appropriate in each case.</SPAN></P>\r
+<P><BR><BR>\r
+</P>\r
+<TABLE WIDTH=557 BORDER=1 BORDERCOLOR="#000000" CELLPADDING=1 CELLSPACING=0>\r
+ <COL WIDTH=132>\r
+ <COL WIDTH=77>\r
+ <COL WIDTH=340>\r
+ <TR>\r
+ <TD WIDTH=132>\r
+ <P ALIGN=CENTER><FONT SIZE=2><B>Parameter</B></FONT></P>\r
+ </TD>\r
+ <TD WIDTH=77>\r
+ <P ALIGN=CENTER><FONT SIZE=2><B>Value</B></FONT></P>\r
+ </TD>\r
+ <TD WIDTH=340>\r
+ <P ALIGN=CENTER><FONT SIZE=2><B>Description</B></FONT></P>\r
+ </TD>\r
+ </TR>\r
+ <TR>\r
+ <TD WIDTH=132>\r
+ <P><FONT SIZE=2>allow-foreign</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=77>\r
+ <P><FONT SIZE=2>"true" | "false" (default) </FONT>\r
+ </P>\r
+ </TD>\r
+ <TD WIDTH=340>\r
+ <P><FONT SIZE=2>Pass non-Schematron elements to the generated\r
+ stylesheet. Pass the Schematron elements span, emph and dir: to\r
+ the output SVRL. </FONT>\r
+ </P>\r
+ </TD>\r
+ </TR>\r
+ <TR>\r
+ <TD WIDTH=132>\r
+ <P><FONT SIZE=2>fileNameParameter</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=77>\r
+ <P><FONT SIZE=2>string</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=340>\r
+ <P><FONT SIZE=2>A parameter passed to the Validator and\r
+ potentially available as a variable in Schematron schemas as\r
+ $fileNameParameter</FONT></P>\r
+ </TD>\r
+ </TR>\r
+ <TR>\r
+ <TD WIDTH=132>\r
+ <P><FONT SIZE=2>fileDirParameter</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=77>\r
+ <P><FONT SIZE=2>string</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=340>\r
+ <P><FONT SIZE=2>A parameter passed to the Validator and\r
+ potentially available as a variable in Schematron schemas as\r
+ $fileDirParameter</FONT></P>\r
+ </TD>\r
+ </TR>\r
+ <TR>\r
+ <TD WIDTH=132>\r
+ <P><FONT SIZE=2>archiveNamePaameter</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=77>\r
+ <P><FONT SIZE=2>string</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=340>\r
+ <P><FONT SIZE=2>A parameter passed to the Validator and\r
+ potentially available as a variable in Schematron schemas as\r
+ $archiveNameParameter</FONT></P>\r
+ </TD>\r
+ </TR>\r
+ <TR>\r
+ <TD WIDTH=132>\r
+ <P><FONT SIZE=2>archiveDirParameter</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=77>\r
+ <P><FONT SIZE=2>string</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=340>\r
+ <P><FONT SIZE=2>A parameter passed to the Validator and\r
+ potentially available as a variable in Schematron schemas as\r
+ $archivePathParameter</FONT></P>\r
+ </TD>\r
+ </TR>\r
+ <TR>\r
+ <TD WIDTH=132>\r
+ <P><FONT SIZE=2>debug </FONT>\r
+ </P>\r
+ </TD>\r
+ <TD WIDTH=77>\r
+ <P>“<FONT SIZE=2>true” | “false” (default)</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=340>\r
+ <P><FONT SIZE=2>Verbose error messages (Note this may be\r
+ superceded by “verbose” at some stage in the future.)</FONT></P>\r
+ </TD>\r
+ </TR>\r
+ <TR>\r
+ <TD WIDTH=132>\r
+ <P><FONT SIZE=2>generate-paths</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=77>\r
+ <P><FONT SIZE=2>true|false </FONT>\r
+ </P>\r
+ </TD>\r
+ <TD WIDTH=340>\r
+ <P><FONT SIZE=2>generate the SVRL @location attribute with XPaths</FONT></P>\r
+ </TD>\r
+ </TR>\r
+ <TR>\r
+ <TD WIDTH=132>\r
+ <P><FONT SIZE=2>diagnose</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=77>\r
+ <P><FONT SIZE=2>yes | no </FONT>\r
+ </P>\r
+ </TD>\r
+ <TD WIDTH=340>\r
+ <P><FONT SIZE=2>Add the diagnostics to the assertion results</FONT></P>\r
+ </TD>\r
+ </TR>\r
+ <TR>\r
+ <TD WIDTH=132>\r
+ <P><A NAME="DDE_LINK"></A><FONT SIZE=2>terminate</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=77>\r
+ <P><FONT SIZE=2>yes | no | true | false | assert</FONT>\r
+ </P>\r
+ </TD>\r
+ <TD WIDTH=340>\r
+ <P><FONT SIZE=2>Terminate on the first failed assertion or\r
+ successful report</FONT></P>\r
+ </TD>\r
+ </TR>\r
+ <TR>\r
+ <TD WIDTH=132>\r
+ <P><FONT SIZE=2>message-newline </FONT>\r
+ </P>\r
+ </TD>\r
+ <TD WIDTH=77>\r
+ <P><FONT SIZE=2>"true" (default) | "false" </FONT>\r
+ </P>\r
+ </TD>\r
+ <TD WIDTH=340>\r
+ <P><FONT SIZE=2>Generate an extra newline at the end of messages</FONT></P>\r
+ </TD>\r
+ </TR>\r
+ <TR>\r
+ <TD WIDTH=132>\r
+ <P><FONT SIZE=2>output-encoding</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=77>\r
+ <P><FONT SIZE=2>string</FONT></P>\r
+ </TD>\r
+ <TD WIDTH=340>\r
+ <P><FONT SIZE=2>The encoding used for output, for example if the\r
+ output is XML</FONT></P>\r
+ </TD>\r
+ </TR>\r
+</TABLE>\r
+<DL>\r
+ <DD STYLE="margin-bottom: 0.5cm"> \r
+ </DD></DL>\r
+</BODY>\r
+</HTML>
\ No newline at end of file