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)