From 6074d27829c19b9c78b33efa7664f8a3fe4a0147287a48ce71a977bd7744cb42 Mon Sep 17 00:00:00 2001
From: Matej Cepl <mcepl@suse.com>
Date: Fri, 14 Jul 2023 16:45:23 +0000
Subject: [PATCH] - Add ISO-Schematron-schema-optional.patch and  
 remove-ISO-Schematron-schema.patch to remove non-free RNG   schema file
 (bsc#1213351).

OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-lxml?expand=0&rev=183
---
 ISO-Schematron-schema-optional.patch | 110 ++++
 python-lxml.changes                  |   7 +
 python-lxml.spec                     |   6 +
 remove-ISO-Schematron-schema.patch   | 731 +++++++++++++++++++++++++++
 4 files changed, 854 insertions(+)
 create mode 100644 ISO-Schematron-schema-optional.patch
 create mode 100644 remove-ISO-Schematron-schema.patch

diff --git a/ISO-Schematron-schema-optional.patch b/ISO-Schematron-schema-optional.patch
new file mode 100644
index 0000000..8306ce9
--- /dev/null
+++ b/ISO-Schematron-schema-optional.patch
@@ -0,0 +1,110 @@
+From 4bfab2c821961fb4c5ed8a04e329778c9b09a1df Mon Sep 17 00:00:00 2001
+From: Stefan Behnel <stefan_ml@behnel.de>
+Date: Wed, 12 Jul 2023 16:59:07 +0200
+Subject: [PATCH] Make the validation of ISO-Schematron files optional in lxml,
+ depending on the availability of the RNG validation file. Some lxml
+ distributions discard the validation schema file due to licensing issues.
+
+See https://bugs.launchpad.net/lxml/+bug/2024343
+---
+ CHANGES.txt                        |    8 ++++++++
+ doc/validation.txt                 |    9 +++++++++
+ src/lxml/isoschematron/__init__.py |   24 +++++++++++++++++++-----
+ 3 files changed, 36 insertions(+), 5 deletions(-)
+
+Index: lxml-4.9.2/CHANGES.txt
+===================================================================
+--- lxml-4.9.2.orig/CHANGES.txt
++++ lxml-4.9.2/CHANGES.txt
+@@ -2,6 +2,14 @@
+ lxml changelog
+ ==============
+ 
++* LP#2024343: The validation of the schema file itself is now optional in the
++  ISO-Schematron implementation.  This was done because some lxml distributions
++  discard the RNG validation schema file due to licensing issues.  The validation
++  can now always be disabled with ``Schematron(..., validate_schema=False)``.
++  It is enabled by default if available and disabled otherwise.  The module
++  constant ``lxml.isoschematron.schematron_schema_valid_supported`` can be used
++  to detect whether schema file validation is available.
++
+ 4.9.2 (2022-12-13)
+ ==================
+ 
+Index: lxml-4.9.2/doc/validation.txt
+===================================================================
+--- lxml-4.9.2.orig/doc/validation.txt
++++ lxml-4.9.2/doc/validation.txt
+@@ -615,6 +615,15 @@ The usage of validation phases is a uniq
+ a very powerful tool e.g. for establishing validation stages or to provide 
+ different validators for different "validation audiences".
+ 
++Note: Some lxml distributions exclude the validation schema file due to licensing issues.
++Since lxml 5.0, the validation of the user provided schema can be disabled with
++``Schematron(..., validate_schema=False)``.
++It is enabled by default if available and disabled otherwise.  Previous versions of
++lxml always had it enabled and failed at import time if the file was not available.
++Thus, some distributions chose to remove the entire ISO-Schematron support.
++The module constant ``lxml.isoschematron.schematron_schema_valid_supported`` can be used
++since lxml 5.0 to detect whether schema file validation is available.
++
+ (Pre-ISO-Schematron)
+ --------------------
+ 
+Index: lxml-4.9.2/src/lxml/isoschematron/__init__.py
+===================================================================
+--- lxml-4.9.2.orig/src/lxml/isoschematron/__init__.py
++++ lxml-4.9.2/src/lxml/isoschematron/__init__.py
+@@ -61,10 +61,16 @@ iso_svrl_for_xslt1 = _etree.XSLT(_etree.
+ svrl_validation_errors = _etree.XPath(
+     '//svrl:failed-assert', namespaces={'svrl': SVRL_NS})
+ 
+-
+ # RelaxNG validator for schematron schemas
+-schematron_schema_valid = _etree.RelaxNG(
+-    file=os.path.join(_resources_dir, 'rng', 'iso-schematron.rng'))
++schematron_schema_valid_supported = False
++try:
++    schematron_schema_valid = _etree.RelaxNG(
++        file=os.path.join(_resources_dir, 'rng', 'iso-schematron.rng'))
++    schematron_schema_valid_supported = True
++except _etree.RelaxNGParseError:
++    # Some distributions delete the file due to licensing issues.
++    def schematron_schema_valid(arg):
++        raise NotImplementedError("Validating the ISO schematron requires iso-schematron.rng")
+ 
+ 
+ def stylesheet_params(**kwargs):
+@@ -153,6 +159,13 @@ class Schematron(_etree._Validator):
+     report document gets stored and can be accessed as the ``validation_report``
+     property.
+ 
++    If ``validate_schema`` is set to False, the validation of the schema file
++    itself is disabled.  Validation happens by default after building the full
++    schema, unless the schema validation file cannot be found at import time,
++    in which case the validation gets disabled.  Some lxml distributions exclude
++    this file due to licensing issues.  ISO-Schematron validation can then still
++    be used normally, but the schemas themselves cannot be validated.
++
+     Here is a usage example::
+ 
+       >>> from lxml import etree
+@@ -234,7 +247,8 @@ class Schematron(_etree._Validator):
+     def __init__(self, etree=None, file=None, include=True, expand=True,
+                  include_params={}, expand_params={}, compile_params={},
+                  store_schematron=False, store_xslt=False, store_report=False,
+-                 phase=None, error_finder=ASSERTS_ONLY):
++                 phase=None, error_finder=ASSERTS_ONLY,
++                 validate_schema=schematron_schema_valid_supported):
+         super(Schematron, self).__init__()
+ 
+         self._store_report = store_report
+@@ -273,7 +287,7 @@ class Schematron(_etree._Validator):
+             schematron = self._include(schematron, **include_params)
+         if expand:
+             schematron = self._expand(schematron, **expand_params)
+-        if not schematron_schema_valid(schematron):
++        if validate_schema and not schematron_schema_valid(schematron):
+             raise _etree.SchematronParseError(
+                 "invalid schematron schema: %s" %
+                 schematron_schema_valid.error_log)
diff --git a/python-lxml.changes b/python-lxml.changes
index ef2dfec..3718c1e 100644
--- a/python-lxml.changes
+++ b/python-lxml.changes
@@ -1,3 +1,10 @@
+-------------------------------------------------------------------
+Fri Jul 14 15:42:00 UTC 2023 - Matej Cepl <mcepl@suse.com>
+
+- Add ISO-Schematron-schema-optional.patch and
+  remove-ISO-Schematron-schema.patch to remove non-free RNG
+  schema file (bsc#1213351).
+
 -------------------------------------------------------------------
 Thu May  4 14:52:53 UTC 2023 - David Anes <david.anes@suse.com>
 
diff --git a/python-lxml.spec b/python-lxml.spec
index 0bb6a4b..75d994c 100644
--- a/python-lxml.spec
+++ b/python-lxml.spec
@@ -36,6 +36,12 @@ Patch1:         skip-test-under-libxml2-2.10.4.patch
 # PATCH-FIX-OPENSUSE Skip a test under libxml2 2.11.1+
 # https://bugs.launchpad.net/lxml/+bug/2018522
 Patch2:         skip-test-under-libxml2-2.11.1.patch
+# PATCH-FIX-UPSTREAM ISO-Schematron-schema-optional.patch lp#2024343 mcepl@suse.com
+# Make ISO Schematron RNG validation schemes optional and then remove it gh#lxml/lxml@4bfab2c82196
+Patch3:         ISO-Schematron-schema-optional.patch
+# PATCH-FIX-UPSTREAM remove-ISO-Schematron-schema.patch gl#fedora/legal/fedora-license-data/-#154 mcepl@suse.com
+# Actually remove the schema
+Patch4:         remove-ISO-Schematron-schema.patch
 BuildRequires:  %{python_module Cython >= 0.29.7}
 BuildRequires:  %{python_module base}
 BuildRequires:  %{python_module cssselect >= 0.9.1}
diff --git a/remove-ISO-Schematron-schema.patch b/remove-ISO-Schematron-schema.patch
new file mode 100644
index 0000000..1bba569
--- /dev/null
+++ b/remove-ISO-Schematron-schema.patch
@@ -0,0 +1,731 @@
+---
+ src/lxml/isoschematron/resources/rng/iso-schematron.rng |  709 ----------------
+ src/lxml/tests/test_isoschematron.py                    |    1 
+ 2 files changed, 1 insertion(+), 709 deletions(-)
+
+Index: lxml-4.9.2/src/lxml/isoschematron/resources/rng/iso-schematron.rng
+===================================================================
+--- lxml-4.9.2.orig/src/lxml/isoschematron/resources/rng/iso-schematron.rng
++++ /dev/null
+@@ -1,709 +0,0 @@
+-<?xml version="1.0" encoding="UTF-8"?>
+-<!-- Copyright © ISO/IEC 2015 -->
+-<!--
+-  The following permission notice and disclaimer shall be included in all
+-  copies of this XML schema ("the Schema"), and derivations of the Schema:
+-  
+-  Permission is hereby granted, free of charge in perpetuity, to any
+-  person obtaining a copy of the Schema, to use, copy, modify, merge and
+-  distribute free of charge, copies of the Schema for the purposes of
+-  developing, implementing, installing and using software based on the
+-  Schema, and to permit persons to whom the Schema is furnished to do so,
+-  subject to the following conditions:
+-  
+-  THE SCHEMA 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 SCHEMA OR THE USE OR
+-  OTHER DEALINGS IN THE SCHEMA.
+-  
+-  In addition, any modified copy of the Schema shall include the following
+-  notice:
+-  
+-  "THIS SCHEMA HAS BEEN MODIFIED FROM THE SCHEMA DEFINED IN ISO/IEC 19757-3,
+-  AND SHOULD NOT BE INTERPRETED AS COMPLYING WITH THAT STANDARD".
+--->
+-<grammar ns="http://purl.oclc.org/dsdl/schematron" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+-  <start>
+-    <ref name="schema"/>
+-  </start>
+-  <!-- Element declarations -->
+-  <define name="schema">
+-    <element name="schema">
+-      <optional>
+-        <attribute name="id">
+-          <data type="ID"/>
+-        </attribute>
+-      </optional>
+-      <ref name="rich"/>
+-      <optional>
+-        <attribute name="schemaVersion">
+-          <ref name="non-empty-string"/>
+-        </attribute>
+-      </optional>
+-      <optional>
+-        <attribute name="defaultPhase">
+-          <data type="IDREF"/>
+-        </attribute>
+-      </optional>
+-      <optional>
+-        <attribute name="queryBinding">
+-          <ref name="non-empty-string"/>
+-        </attribute>
+-      </optional>
+-      <interleave>
+-        <ref name="foreign"/>
+-        <zeroOrMore>
+-          <ref name="inclusion"/>
+-        </zeroOrMore>
+-        <group>
+-          <optional>
+-            <ref name="title"/>
+-          </optional>
+-          <zeroOrMore>
+-            <ref name="ns"/>
+-          </zeroOrMore>
+-          <zeroOrMore>
+-            <ref name="p"/>
+-          </zeroOrMore>
+-          <zeroOrMore>
+-            <ref name="let"/>
+-          </zeroOrMore>
+-          <zeroOrMore>
+-            <ref name="phase"/>
+-          </zeroOrMore>
+-          <oneOrMore>
+-            <ref name="pattern"/>
+-          </oneOrMore>
+-          <zeroOrMore>
+-            <ref name="p"/>
+-          </zeroOrMore>
+-          <optional>
+-            <ref name="diagnostics"/>
+-          </optional>
+-          <optional>
+-            <!-- edited (lxml): required in standard, optional here (since it can be empty anyway) -->
+-            <ref name="properties"/>
+-          </optional>
+-        </group>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="active">
+-    <element name="active">
+-      <attribute name="pattern">
+-        <data type="IDREF"/>
+-      </attribute>
+-      <interleave>
+-        <ref name="foreign"/>
+-        <zeroOrMore>
+-          <choice>
+-            <text/>
+-            <ref name="dir"/>
+-            <ref name="emph"/>
+-            <ref name="span"/>
+-          </choice>
+-        </zeroOrMore>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="assert">
+-    <element name="assert">
+-      <attribute name="test">
+-        <ref name="exprValue"/>
+-      </attribute>
+-      <optional>
+-        <attribute name="flag">
+-          <ref name="flagValue"/>
+-        </attribute>
+-      </optional>
+-      <optional>
+-        <attribute name="id">
+-          <data type="ID"/>
+-        </attribute>
+-      </optional>
+-      <optional>
+-        <attribute name="diagnostics">
+-          <data type="IDREFS"/>
+-        </attribute>
+-      </optional>
+-      <optional>
+-        <attribute name="properties">
+-          <data type="IDREFS"/>
+-        </attribute>
+-      </optional>
+-      <ref name="rich"/>
+-      <ref name="linkable"/>
+-      <interleave>
+-        <ref name="foreign"/>
+-        <zeroOrMore>
+-          <choice>
+-            <text/>
+-            <ref name="name"/>
+-            <ref name="value-of"/>
+-            <ref name="emph"/>
+-            <ref name="dir"/>
+-            <ref name="span"/>
+-          </choice>
+-        </zeroOrMore>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="diagnostic">
+-    <element name="diagnostic">
+-      <attribute name="id">
+-        <data type="ID"/>
+-      </attribute>
+-      <ref name="rich"/>
+-      <interleave>
+-        <ref name="foreign"/>
+-        <zeroOrMore>
+-          <choice>
+-            <text/>
+-            <ref name="value-of"/>
+-            <ref name="emph"/>
+-            <ref name="dir"/>
+-            <ref name="span"/>
+-          </choice>
+-        </zeroOrMore>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="diagnostics">
+-    <element name="diagnostics">
+-      <interleave>
+-        <ref name="foreign"/>
+-        <zeroOrMore>
+-          <ref name="inclusion"/>
+-        </zeroOrMore>
+-        <zeroOrMore>
+-          <ref name="diagnostic"/>
+-        </zeroOrMore>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="dir">
+-    <element name="dir">
+-      <optional>
+-        <attribute name="value">
+-          <choice>
+-            <value>ltr</value>
+-            <value>rtl</value>
+-          </choice>
+-        </attribute>
+-      </optional>
+-      <interleave>
+-        <ref name="foreign"/>
+-        <text/>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="emph">
+-    <element name="emph">
+-      <text/>
+-    </element>
+-  </define>
+-  <define name="extends">
+-    <element name="extends">
+-      <choice>
+-        <attribute name="rule">
+-          <data type="IDREF"/>
+-        </attribute>
+-        <attribute name="href">
+-          <ref name="uriValue"/>
+-        </attribute>
+-      </choice>
+-      <ref name="foreign-empty"/>
+-    </element>
+-  </define>
+-  <define name="let">
+-    <element name="let">
+-      <attribute name="name">
+-        <ref name="nameValue"/>
+-      </attribute>
+-      <choice>
+-        <attribute name="value">
+-          <data type="string" datatypeLibrary=""/>
+-        </attribute>
+-        <oneOrMore>
+-          <ref name="foreign-element"/>
+-        </oneOrMore>
+-      </choice>
+-    </element>
+-  </define>
+-  <define name="name">
+-    <element name="name">
+-      <optional>
+-        <attribute name="path">
+-          <ref name="pathValue"/>
+-        </attribute>
+-      </optional>
+-      <ref name="foreign-empty"/>
+-    </element>
+-  </define>
+-  <define name="ns">
+-    <element name="ns">
+-      <attribute name="uri">
+-        <ref name="uriValue"/>
+-      </attribute>
+-      <attribute name="prefix">
+-        <ref name="nameValue"/>
+-      </attribute>
+-      <ref name="foreign-empty"/>
+-    </element>
+-  </define>
+-  <define name="p">
+-    <element name="p">
+-      <optional>
+-        <attribute name="id">
+-          <data type="ID"/>
+-        </attribute>
+-      </optional>
+-      <optional>
+-        <attribute name="class">
+-          <ref name="classValue"/>
+-        </attribute>
+-      </optional>
+-      <optional>
+-        <attribute name="icon">
+-          <ref name="uriValue"/>
+-        </attribute>
+-      </optional>
+-      <interleave>
+-        <ref name="foreign"/>
+-        <zeroOrMore>
+-          <choice>
+-            <text/>
+-            <ref name="dir"/>
+-            <ref name="emph"/>
+-            <ref name="span"/>
+-          </choice>
+-        </zeroOrMore>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="param">
+-    <element name="param">
+-      <attribute name="name">
+-        <ref name="nameValue"/>
+-      </attribute>
+-      <attribute name="value">
+-        <ref name="non-empty-string"/>
+-      </attribute>
+-    </element>
+-  </define>
+-  <define name="pattern">
+-    <element name="pattern">
+-      <optional>
+-        <attribute name="documents">
+-          <ref name="pathValue"/>
+-        </attribute>
+-      </optional>
+-      <ref name="rich"/>
+-      <interleave>
+-        <ref name="foreign"/>
+-        <zeroOrMore>
+-          <ref name="inclusion"/>
+-        </zeroOrMore>
+-        <choice>
+-          <group>
+-            <attribute name="abstract">
+-              <value>true</value>
+-            </attribute>
+-            <attribute name="id">
+-              <data type="ID"/>
+-            </attribute>
+-            <optional>
+-              <ref name="title"/>
+-            </optional>
+-            <group>
+-              <zeroOrMore>
+-                <ref name="p"/>
+-              </zeroOrMore>
+-              <zeroOrMore>
+-                <ref name="let"/>
+-              </zeroOrMore>
+-              <zeroOrMore>
+-                <ref name="rule"/>
+-              </zeroOrMore>
+-            </group>
+-          </group>
+-          <group>
+-            <optional>
+-              <attribute name="abstract">
+-                <value>false</value>
+-              </attribute>
+-            </optional>
+-            <optional>
+-              <attribute name="id">
+-                <data type="ID"/>
+-              </attribute>
+-            </optional>
+-            <optional>
+-              <ref name="title"/>
+-            </optional>
+-            <group>
+-              <zeroOrMore>
+-                <ref name="p"/>
+-              </zeroOrMore>
+-              <zeroOrMore>
+-                <ref name="let"/>
+-              </zeroOrMore>
+-              <zeroOrMore>
+-                <ref name="rule"/>
+-              </zeroOrMore>
+-            </group>
+-          </group>
+-          <group>
+-            <optional>
+-              <attribute name="abstract">
+-                <value>false</value>
+-              </attribute>
+-            </optional>
+-            <attribute name="is-a">
+-              <data type="IDREF"/>
+-            </attribute>
+-            <optional>
+-              <attribute name="id">
+-                <data type="ID"/>
+-              </attribute>
+-            </optional>
+-            <optional>
+-              <ref name="title"/>
+-            </optional>
+-            <group>
+-              <zeroOrMore>
+-                <ref name="p"/>
+-              </zeroOrMore>
+-              <zeroOrMore>
+-                <ref name="param"/>
+-              </zeroOrMore>
+-            </group>
+-          </group>
+-        </choice>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="phase">
+-    <element name="phase">
+-      <attribute name="id">
+-        <data type="ID"/>
+-      </attribute>
+-      <ref name="rich"/>
+-      <interleave>
+-        <ref name="foreign"/>
+-        <zeroOrMore>
+-          <ref name="inclusion"/>
+-        </zeroOrMore>
+-        <group>
+-          <zeroOrMore>
+-            <ref name="p"/>
+-          </zeroOrMore>
+-          <zeroOrMore>
+-            <ref name="let"/>
+-          </zeroOrMore>
+-          <zeroOrMore>
+-            <ref name="active"/>
+-          </zeroOrMore>
+-        </group>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="properties">
+-    <element name="properties">
+-      <zeroOrMore>
+-        <ref name="property"/>
+-      </zeroOrMore>
+-    </element>
+-  </define>
+-  <define name="property">
+-    <element name="property">
+-      <attribute name="id">
+-        <data type="ID"/>
+-      </attribute>
+-      <optional>
+-        <attribute name="role">
+-          <ref name="roleValue"/>
+-        </attribute>
+-      </optional>
+-      <optional>
+-        <attribute name="scheme"/>
+-      </optional>
+-      <interleave>
+-        <ref name="foreign"/>
+-        <zeroOrMore>
+-          <choice>
+-            <text/>
+-            <ref name="name"/>
+-            <ref name="value-of"/>
+-            <ref name="emph"/>
+-            <ref name="dir"/>
+-            <ref name="span"/>
+-          </choice>
+-        </zeroOrMore>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="report">
+-    <element name="report">
+-      <attribute name="test">
+-        <ref name="exprValue"/>
+-      </attribute>
+-      <optional>
+-        <attribute name="flag">
+-          <ref name="flagValue"/>
+-        </attribute>
+-      </optional>
+-      <optional>
+-        <attribute name="id">
+-          <data type="ID"/>
+-        </attribute>
+-      </optional>
+-      <optional>
+-        <attribute name="diagnostics">
+-          <data type="IDREFS"/>
+-        </attribute>
+-      </optional>
+-      <optional>
+-        <attribute name="properties">
+-          <data type="IDREFS"/>
+-        </attribute>
+-      </optional>
+-      <ref name="rich"/>
+-      <ref name="linkable"/>
+-      <interleave>
+-        <ref name="foreign"/>
+-        <zeroOrMore>
+-          <choice>
+-            <text/>
+-            <ref name="name"/>
+-            <ref name="value-of"/>
+-            <ref name="emph"/>
+-            <ref name="dir"/>
+-            <ref name="span"/>
+-          </choice>
+-        </zeroOrMore>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="rule">
+-    <element name="rule">
+-      <optional>
+-        <attribute name="flag">
+-          <ref name="flagValue"/>
+-        </attribute>
+-      </optional>
+-      <ref name="rich"/>
+-      <ref name="linkable"/>
+-      <interleave>
+-        <ref name="foreign"/>
+-        <zeroOrMore>
+-          <ref name="inclusion"/>
+-        </zeroOrMore>
+-        <choice>
+-          <group>
+-            <attribute name="abstract">
+-              <value>true</value>
+-            </attribute>
+-            <attribute name="id">
+-              <data type="ID"/>
+-            </attribute>
+-            <zeroOrMore>
+-              <ref name="let"/>
+-            </zeroOrMore>
+-            <oneOrMore>
+-              <choice>
+-                <ref name="assert"/>
+-                <ref name="report"/>
+-                <ref name="extends"/>
+-                <ref name="p"/>
+-              </choice>
+-            </oneOrMore>
+-          </group>
+-          <group>
+-            <attribute name="context">
+-              <ref name="pathValue"/>
+-            </attribute>
+-            <optional>
+-              <attribute name="id">
+-                <data type="ID"/>
+-              </attribute>
+-            </optional>
+-            <optional>
+-              <attribute name="abstract">
+-                <value>false</value>
+-              </attribute>
+-            </optional>
+-            <zeroOrMore>
+-              <ref name="let"/>
+-            </zeroOrMore>
+-            <oneOrMore>
+-              <choice>
+-                <ref name="assert"/>
+-                <ref name="report"/>
+-                <ref name="extends"/>
+-                <ref name="p"/>
+-              </choice>
+-            </oneOrMore>
+-          </group>
+-        </choice>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="span">
+-    <element name="span">
+-      <attribute name="class">
+-        <ref name="classValue"/>
+-      </attribute>
+-      <interleave>
+-        <ref name="foreign"/>
+-        <text/>
+-      </interleave>
+-    </element>
+-  </define>
+-  <define name="title">
+-    <element name="title">
+-      <zeroOrMore>
+-        <choice>
+-          <text/>
+-          <ref name="dir"/>
+-        </choice>
+-      </zeroOrMore>
+-    </element>
+-  </define>
+-  <define name="value-of">
+-    <element name="value-of">
+-      <attribute name="select">
+-        <ref name="pathValue"/>
+-      </attribute>
+-      <ref name="foreign-empty"/>
+-    </element>
+-  </define>
+-  <!-- common declarations -->
+-  <define name="inclusion">
+-    <element name="include">
+-      <attribute name="href">
+-        <ref name="uriValue"/>
+-      </attribute>
+-      <ref name="foreign-empty"/>
+-    </element>
+-  </define>
+-  <define name="rich">
+-    <optional>
+-      <attribute name="icon">
+-        <ref name="uriValue"/>
+-      </attribute>
+-    </optional>
+-    <optional>
+-      <attribute name="see">
+-        <ref name="uriValue"/>
+-      </attribute>
+-    </optional>
+-    <optional>
+-      <attribute name="fpi">
+-        <ref name="fpiValue"/>
+-      </attribute>
+-    </optional>
+-    <optional>
+-      <attribute name="xml:lang">
+-        <ref name="langValue"/>
+-      </attribute>
+-    </optional>
+-    <optional>
+-      <attribute name="xml:space">
+-        <choice>
+-          <value>preserve</value>
+-          <value>default</value>
+-        </choice>
+-      </attribute>
+-    </optional>
+-  </define>
+-  <define name="linkable">
+-    <optional>
+-      <attribute name="role">
+-        <ref name="roleValue"/>
+-      </attribute>
+-    </optional>
+-    <optional>
+-      <attribute name="subject">
+-        <ref name="pathValue"/>
+-      </attribute>
+-    </optional>
+-  </define>
+-  <define name="foreign">
+-    <ref name="foreign-attributes"/>
+-    <zeroOrMore>
+-      <ref name="foreign-element"/>
+-    </zeroOrMore>
+-  </define>
+-  <define name="foreign-empty">
+-    <ref name="foreign-attributes"/>
+-  </define>
+-  <define name="foreign-attributes">
+-    <zeroOrMore>
+-      <attribute>
+-        <anyName>
+-          <except>
+-            <nsName ns=""/>
+-            <nsName ns="http://www.w3.org/XML/1998/namespace"/>
+-          </except>
+-        </anyName>
+-      </attribute>
+-    </zeroOrMore>
+-  </define>
+-  <define name="foreign-element">
+-    <element>
+-      <anyName>
+-        <except>
+-          <nsName/>
+-        </except>
+-      </anyName>
+-      <zeroOrMore>
+-        <choice>
+-          <attribute>
+-            <anyName/>
+-          </attribute>
+-          <ref name="foreign-element"/>
+-          <ref name="schema"/>
+-          <text/>
+-        </choice>
+-      </zeroOrMore>
+-    </element>
+-  </define>
+-  <!-- Data types -->
+-  <define name="uriValue">
+-    <data type="anyURI"/>
+-  </define>
+-  <define name="pathValue">
+-    <data type="string" datatypeLibrary=""/>
+-  </define>
+-  <define name="exprValue">
+-    <data type="string" datatypeLibrary=""/>
+-  </define>
+-  <define name="fpiValue">
+-    <data type="string" datatypeLibrary=""/>
+-  </define>
+-  <define name="langValue">
+-    <data type="language"/>
+-  </define>
+-  <define name="roleValue">
+-    <data type="string" datatypeLibrary=""/>
+-  </define>
+-  <define name="flagValue">
+-    <data type="string" datatypeLibrary=""/>
+-  </define>
+-  <define name="nameValue">
+-    <data type="string" datatypeLibrary=""/>
+-  </define>
+-  <!-- In the default query language binding, xsd:NCNAME -->
+-  <define name="classValue">
+-    <data type="string" datatypeLibrary=""/>
+-  </define>
+-  <define name="non-empty-string">
+-    <data type="token">
+-      <param name="minLength">1</param>
+-    </data>
+-  </define>
+-</grammar>
+Index: lxml-4.9.2/src/lxml/tests/test_isoschematron.py
+===================================================================
+--- lxml-4.9.2.orig/src/lxml/tests/test_isoschematron.py
++++ lxml-4.9.2/src/lxml/tests/test_isoschematron.py
+@@ -55,6 +55,7 @@ class ETreeISOSchematronTestCase(HelperT
+         schema = isoschematron.Schematron(schema)
+         self.assertTrue(schema)
+ 
++    @unittest.skip("No RNG schema present, validation is not possible.")
+     def test_schematron_invalid_schema_empty(self):
+         schema = self.parse('''\
+ <schema xmlns="http://purl.oclc.org/dsdl/schematron" />