mirror of
https://github.com/itplr-kosit/validator.git
synced 2026-05-26 01:05:38 +00:00
#55 More robust reporting in case of Schematron Error
This commit is contained in:
parent
cd061b22c0
commit
8fb1098925
9 changed files with 365 additions and 23 deletions
|
|
@ -0,0 +1,235 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xsl:stylesheet
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:s="http://validator.kosit.de/test-sample"
|
||||
version="2.0"><!--Implementers: please note that overriding process-prolog or process-root is
|
||||
the preferred method for meta-stylesheets to use where possible. -->
|
||||
<xsl:param name="archiveDirParameter" />
|
||||
<xsl:param name="archiveNameParameter" />
|
||||
<xsl:param name="fileNameParameter" />
|
||||
<xsl:param name="fileDirParameter" />
|
||||
<xsl:variable name="document-uri">
|
||||
<xsl:value-of select="document-uri(/)" />
|
||||
</xsl:variable>
|
||||
|
||||
<!--PHASES-->
|
||||
|
||||
|
||||
<!--PROLOG-->
|
||||
<xsl:output xmlns:svrl="http://purl.oclc.org/dsdl/svrl"
|
||||
method="xml"
|
||||
omit-xml-declaration="no"
|
||||
standalone="yes"
|
||||
indent="yes" />
|
||||
|
||||
<!--XSD TYPES FOR XSLT2-->
|
||||
|
||||
|
||||
<!--KEYS AND FUNCTIONS-->
|
||||
|
||||
|
||||
<!--DEFAULT RULES-->
|
||||
|
||||
|
||||
<!--MODE: SCHEMATRON-SELECT-FULL-PATH-->
|
||||
<!--This mode can be used to generate an ugly though full XPath for locators-->
|
||||
<xsl:template match="*" mode="schematron-select-full-path">
|
||||
<xsl:apply-templates select="." mode="schematron-get-full-path" />
|
||||
</xsl:template>
|
||||
|
||||
<!--MODE: SCHEMATRON-FULL-PATH-->
|
||||
<!--This mode can be used to generate an ugly though full XPath for locators-->
|
||||
<xsl:template match="*" mode="schematron-get-full-path">
|
||||
<xsl:apply-templates select="parent::*" mode="schematron-get-full-path" />
|
||||
<xsl:text>/</xsl:text>
|
||||
<xsl:choose>
|
||||
<xsl:when test="namespace-uri()=''">
|
||||
<xsl:value-of select="name()" />
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text>*:</xsl:text>
|
||||
<xsl:value-of select="local-name()" />
|
||||
<xsl:text>[namespace-uri()='</xsl:text>
|
||||
<xsl:value-of select="namespace-uri()" />
|
||||
<xsl:text>']</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:variable name="preceding"
|
||||
select="count(preceding-sibling::*[local-name()=local-name(current()) and namespace-uri() = namespace-uri(current())])" />
|
||||
<xsl:text>[</xsl:text>
|
||||
<xsl:value-of select="1+ $preceding" />
|
||||
<xsl:text>]</xsl:text>
|
||||
</xsl:template>
|
||||
<xsl:template match="@*" mode="schematron-get-full-path">
|
||||
<xsl:apply-templates select="parent::*" mode="schematron-get-full-path" />
|
||||
<xsl:text>/</xsl:text>
|
||||
<xsl:choose>
|
||||
<xsl:when test="namespace-uri()=''">@<xsl:value-of select="name()" />
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text>@*[local-name()='</xsl:text>
|
||||
<xsl:value-of select="local-name()" />
|
||||
<xsl:text>' and namespace-uri()='</xsl:text>
|
||||
<xsl:value-of select="namespace-uri()" />
|
||||
<xsl:text>']</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<!--MODE: SCHEMATRON-FULL-PATH-2-->
|
||||
<!--This mode can be used to generate prefixed XPath for humans-->
|
||||
<xsl:template match="node() | @*" mode="schematron-get-full-path-2">
|
||||
<xsl:for-each select="ancestor-or-self::*">
|
||||
<xsl:text>/</xsl:text>
|
||||
<xsl:value-of select="name(.)" />
|
||||
<xsl:if test="preceding-sibling::*[name(.)=name(current())]">
|
||||
<xsl:text>[</xsl:text>
|
||||
<xsl:value-of select="count(preceding-sibling::*[name(.)=name(current())])+1" />
|
||||
<xsl:text>]</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:if test="not(self::*)">
|
||||
<xsl:text />/@<xsl:value-of select="name(.)" />
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
<!--MODE: SCHEMATRON-FULL-PATH-3-->
|
||||
<!--This mode can be used to generate prefixed XPath for humans
|
||||
(Top-level element has index)-->
|
||||
<xsl:template match="node() | @*" mode="schematron-get-full-path-3">
|
||||
<xsl:for-each select="ancestor-or-self::*">
|
||||
<xsl:text>/</xsl:text>
|
||||
<xsl:value-of select="name(.)" />
|
||||
<xsl:if test="parent::*">
|
||||
<xsl:text>[</xsl:text>
|
||||
<xsl:value-of select="count(preceding-sibling::*[name(.)=name(current())])+1" />
|
||||
<xsl:text>]</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:if test="not(self::*)">
|
||||
<xsl:text />/@<xsl:value-of select="name(.)" />
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<!--MODE: GENERATE-ID-FROM-PATH -->
|
||||
<xsl:template match="/" mode="generate-id-from-path" />
|
||||
<xsl:template match="text()" mode="generate-id-from-path">
|
||||
<xsl:apply-templates select="parent::*" mode="generate-id-from-path" />
|
||||
<xsl:value-of select="concat('.text-', 1+count(preceding-sibling::text()), '-')" />
|
||||
</xsl:template>
|
||||
<xsl:template match="comment()" mode="generate-id-from-path">
|
||||
<xsl:apply-templates select="parent::*" mode="generate-id-from-path" />
|
||||
<xsl:value-of select="concat('.comment-', 1+count(preceding-sibling::comment()), '-')" />
|
||||
</xsl:template>
|
||||
<xsl:template match="processing-instruction()" mode="generate-id-from-path">
|
||||
<xsl:apply-templates select="parent::*" mode="generate-id-from-path" />
|
||||
<xsl:value-of select="concat('.processing-instruction-', 1+count(preceding-sibling::processing-instruction()), '-')" />
|
||||
</xsl:template>
|
||||
<xsl:template match="@*" mode="generate-id-from-path">
|
||||
<xsl:apply-templates select="parent::*" mode="generate-id-from-path" />
|
||||
<xsl:value-of select="concat('.@', name())" />
|
||||
</xsl:template>
|
||||
<xsl:template match="*" mode="generate-id-from-path" priority="-0.5">
|
||||
<xsl:apply-templates select="parent::*" mode="generate-id-from-path" />
|
||||
<xsl:text>.</xsl:text>
|
||||
<xsl:value-of select="concat('.',name(),'-',1+count(preceding-sibling::*[name()=name(current())]),'-')" />
|
||||
</xsl:template>
|
||||
|
||||
<!--MODE: GENERATE-ID-2 -->
|
||||
<xsl:template match="/" mode="generate-id-2">U</xsl:template>
|
||||
<xsl:template match="*" mode="generate-id-2" priority="2">
|
||||
<xsl:text>U</xsl:text>
|
||||
<xsl:number level="multiple" count="*" />
|
||||
</xsl:template>
|
||||
<xsl:template match="node()" mode="generate-id-2">
|
||||
<xsl:text>U.</xsl:text>
|
||||
<xsl:number level="multiple" count="*" />
|
||||
<xsl:text>n</xsl:text>
|
||||
<xsl:number count="node()" />
|
||||
</xsl:template>
|
||||
<xsl:template match="@*" mode="generate-id-2">
|
||||
<xsl:text>U.</xsl:text>
|
||||
<xsl:number level="multiple" count="*" />
|
||||
<xsl:text>_</xsl:text>
|
||||
<xsl:value-of select="string-length(local-name(.))" />
|
||||
<xsl:text>_</xsl:text>
|
||||
<xsl:value-of select="translate(name(),':','.')" />
|
||||
</xsl:template>
|
||||
<!--Strip characters-->
|
||||
<xsl:template match="text()" priority="-1" />
|
||||
|
||||
<!--SCHEMA SETUP-->
|
||||
<xsl:template match="/">
|
||||
<svrl:schematron-output xmlns:svrl="http://purl.oclc.org/dsdl/svrl"
|
||||
title="Schematron Simple"
|
||||
schemaVersion="">
|
||||
<xsl:comment>
|
||||
<xsl:value-of select="$archiveDirParameter" />
|
||||
<xsl:value-of select="$archiveNameParameter" />
|
||||
<xsl:value-of select="$fileNameParameter" />
|
||||
<xsl:value-of select="$fileDirParameter" />
|
||||
</xsl:comment>
|
||||
<svrl:ns-prefix-in-attribute-values uri="http://www.w3.org/2001/XMLSchema" prefix="xs" />
|
||||
<svrl:ns-prefix-in-attribute-values uri="http://validator.kosit.de/test-sample" prefix="s" />
|
||||
<svrl:active-pattern>
|
||||
<xsl:attribute name="document">
|
||||
<xsl:value-of select="document-uri(/)" />
|
||||
</xsl:attribute>
|
||||
<xsl:apply-templates />
|
||||
</svrl:active-pattern>
|
||||
<xsl:apply-templates select="/" mode="M3" />
|
||||
</svrl:schematron-output>
|
||||
</xsl:template>
|
||||
|
||||
<!--SCHEMATRON PATTERNS-->
|
||||
<svrl:text xmlns:svrl="http://purl.oclc.org/dsdl/svrl">Schematron Simple</svrl:text>
|
||||
|
||||
<!--PATTERN -->
|
||||
|
||||
|
||||
<!--RULE -->
|
||||
<xsl:template match="s:simple" priority="1001" mode="M3">
|
||||
<svrl:fired-rule xmlns:svrl="http://purl.oclc.org/dsdl/svrl" context="s:simple" />
|
||||
|
||||
<!--ASSERT -->
|
||||
<xsl:choose>
|
||||
<xsl:when test="count(s:inner) = 1">
|
||||
<xsl:value-of select="error()" />
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
|
||||
<svrl:failed-assert xmlns:svrl="http://purl.oclc.org/dsdl/svrl" test="count(s:inner) = 1">
|
||||
<xsl:attribute name="id">content-1</xsl:attribute>
|
||||
<xsl:attribute name="location">
|
||||
<xsl:apply-templates select="." mode="schematron-select-full-path" />
|
||||
</xsl:attribute>
|
||||
<svrl:text>The element inner appears exactly once.</svrl:text>
|
||||
</svrl:failed-assert>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:apply-templates select="*|comment()|processing-instruction()" mode="M3" />
|
||||
</xsl:template>
|
||||
|
||||
<!--RULE -->
|
||||
<xsl:template match="s:foo" priority="1000" mode="M3">
|
||||
<svrl:fired-rule xmlns:svrl="http://purl.oclc.org/dsdl/svrl" context="s:foo" />
|
||||
|
||||
<!--ASSERT -->
|
||||
<xsl:choose>
|
||||
<xsl:when test="count(s:inner) = 1" />
|
||||
<xsl:otherwise>
|
||||
<svrl:failed-assert xmlns:svrl="http://purl.oclc.org/dsdl/svrl" test="count(s:inner) = 1">
|
||||
<xsl:attribute name="id">content-2</xsl:attribute>
|
||||
<xsl:attribute name="location">
|
||||
<xsl:apply-templates select="." mode="schematron-select-full-path" />
|
||||
</xsl:attribute>
|
||||
<svrl:text>The element inner appears exactly once.</svrl:text>
|
||||
</svrl:failed-assert>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:apply-templates select="*|comment()|processing-instruction()" mode="M3" />
|
||||
</xsl:template>
|
||||
<xsl:template match="text()" priority="-1" mode="M3" />
|
||||
<xsl:template match="@*|node()" priority="-2" mode="M3">
|
||||
<xsl:apply-templates select="*|comment()|processing-instruction()" mode="M3" />
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
65
src/test/resources/examples/simple/scenarios-with-errors.xml
Normal file
65
src/test/resources/examples/simple/scenarios-with-errors.xml
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ Licensed to the Koordinierungsstelle für IT-Standards (KoSIT) under
|
||||
~ one or more contributor license agreements. See the NOTICE file
|
||||
~ distributed with this work for additional information
|
||||
~ regarding copyright ownership. KoSIT licenses this file
|
||||
~ to you under the Apache License, Version 2.0 (the
|
||||
~ "License"); you may not use this file except in compliance
|
||||
~ with the License. You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing,
|
||||
~ software distributed under the License is distributed on an
|
||||
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
~ KIND, either express or implied. See the License for the
|
||||
~ specific language governing permissions and limitations
|
||||
~ under the License.
|
||||
-->
|
||||
|
||||
<scenarios xmlns="http://www.xoev.de/de/validator/framework/1/scenarios" frameworkVersion="1.1.2">
|
||||
<name>HTML-TestSuite</name>
|
||||
<date>2017-08-08</date>
|
||||
<description>
|
||||
<p>Szenario für Tests mit Fehlern</p>
|
||||
</description>
|
||||
|
||||
<scenario>
|
||||
<name>Simple</name>
|
||||
<description>
|
||||
<p>Schematron-Fehler</p>
|
||||
</description>
|
||||
<namespace prefix="cri">http://www.xoev.de/de/validator/framework/1/createreportinput</namespace>
|
||||
<namespace prefix="test">http://validator.kosit.de/test-sample</namespace>
|
||||
<namespace prefix="rpt">http://validator.kosit.de/test-report</namespace>
|
||||
<match>/test:simple</match>
|
||||
|
||||
<validateWithXmlSchema>
|
||||
<resource>
|
||||
<name>Sample Schema</name>
|
||||
<location>simple.xsd</location>
|
||||
</resource>
|
||||
</validateWithXmlSchema>
|
||||
<validateWithSchematron>
|
||||
<resource>
|
||||
<name>Sample Schematron</name>
|
||||
<location>simple-schematron-error.xsl</location>
|
||||
</resource>
|
||||
</validateWithSchematron>
|
||||
<createReport>
|
||||
<resource>
|
||||
<name>Report für eRechnung</name>
|
||||
<location>report.xsl</location>
|
||||
</resource>
|
||||
</createReport>
|
||||
</scenario>
|
||||
|
||||
<noScenarioReport>
|
||||
<resource>
|
||||
<name>default</name>
|
||||
<location>report.xsl</location>
|
||||
</resource>
|
||||
</noScenarioReport>
|
||||
|
||||
</scenarios>
|
||||
Loading…
Add table
Add a link
Reference in a new issue