diff --git a/src/xmlpatterns/schema/qxsdschemahelper.cpp b/src/xmlpatterns/schema/qxsdschemahelper.cpp
index 8072d926907bf834cac468050caf6f4b4177bf6c..c5e0ee082df70a4bf6369d9272b32c4fb482bdc3 100644
--- a/src/xmlpatterns/schema/qxsdschemahelper.cpp
+++ b/src/xmlpatterns/schema/qxsdschemahelper.cpp
@@ -635,7 +635,7 @@ bool XsdSchemaHelper::substitutionGroupOkTransitive(const XsdElement::Ptr &head,
 
         NamedSchemaComponent::BlockingConstraints checkSet(blockSet);
         checkSet |= head->disallowedSubstitutions();
-        if (head->type()->isComplexType()) {
+        if (head->type()->isComplexType() && head->type()->isDefinedBySchema()) {
             const XsdComplexType::Ptr complexType(head->type());
             checkSet |= complexType->prohibitedSubstitutions();
         }
diff --git a/tests/auto/xmlpatternsvalidator/files/substitution-group-invalid.xml b/tests/auto/xmlpatternsvalidator/files/substitution-group-invalid.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a4ca0c620816d05d7b07aa8ccb7ec7a68c2b38b2
--- /dev/null
+++ b/tests/auto/xmlpatternsvalidator/files/substitution-group-invalid.xml
@@ -0,0 +1,3 @@
+<outer>
+    <innerInvalid>foo</innerInvalid>
+</outer>
diff --git a/tests/auto/xmlpatternsvalidator/files/substitution-group-valid.xml b/tests/auto/xmlpatternsvalidator/files/substitution-group-valid.xml
new file mode 100644
index 0000000000000000000000000000000000000000..54d81a08c685115432833a09e955e573c42e4867
--- /dev/null
+++ b/tests/auto/xmlpatternsvalidator/files/substitution-group-valid.xml
@@ -0,0 +1,3 @@
+<outer>
+    <innerValid>foo</innerValid>
+</outer>
diff --git a/tests/auto/xmlpatternsvalidator/files/substitution-group.xsd b/tests/auto/xmlpatternsvalidator/files/substitution-group.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..7143bb5094e212aef27857d8984034b83b75dd5e
--- /dev/null
+++ b/tests/auto/xmlpatternsvalidator/files/substitution-group.xsd
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+    <xs:element name="outer">
+        <xs:complexType>
+            <xs:choice>
+                <xs:element ref="MySub"/>
+                <xs:element ref="MyBadSub"/>
+            </xs:choice>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="MySub" abstract="true"/>
+    <xs:element name="MyBadSub" type="xs:string" block="substitution"/>
+    <xs:element name="innerValid" substitutionGroup="MySub" type="xs:string"/>
+    <xs:element name="innerInvalid" substitutionGroup="MyBadSub" type="xs:string"/>
+</xs:schema>
diff --git a/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp b/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp
index fb94e091a34da5ea4608ca25b6bb4152139ecfa2..19a20ba211d7f85f7a4486d7fa9ba094d0e62150 100644
--- a/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp
+++ b/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp
@@ -228,6 +228,18 @@ void tst_XmlPatternsValidator::xsdSupport_data() const
         << (QStringList() << path + QLatin1String("dateTime-with-microseconds.xml")
                           << path + QLatin1String("dateTime-with-microseconds.xsd"))
         << QString();
+
+    QTest::newRow("A document with a valid substitution group")
+        << 0
+        << (QStringList() << path + QLatin1String("substitution-group-valid.xml")
+                          << path + QLatin1String("substitution-group.xsd"))
+        << QString();
+
+    QTest::newRow("A document attempting to use a prohibited substitution")
+        << 1
+        << (QStringList() << path + QLatin1String("substitution-group-invalid.xml")
+                          << path + QLatin1String("substitution-group.xsd"))
+        << QString();
 }
 
 QTEST_MAIN(tst_XmlPatternsValidator)