Лучшее решение состоит в том, чтобы удалить элемент <type/>
и иметь только xs:choice
для <a/>
и <b/>
и позволить приложению, использующему xml, отсортировать тип.
Другое решение может заключаться в том, чтобы xs:choice
для <a/>
и <b/>
использовать скрипт xslt для проверки правильности элемента <type/>
в отношении <a/>
и <b/>
.
Сначала проверьте xml по xmlschema, затем используйте xslt, чтобы выполнить преобразование для него, если результатом преобразования является пустая строка, в противном случае будет показана полученная строка в виде сообщения об ошибке.
Как то так ...
XmlSchema:
<xs:element name="some-element">
<xs:complexType>
<xs:sequence>
<xs:element name="type" type="xs:integer" />
<xs:choice>
<xs:element name="a" type="xs:string" />
<xs:element name="b" type="xs:string" />
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:demo="uri:demo:namespace">
<xsl:output method="text" />
<xsl:template match="/demo:some-element">
<xsl:if test="type = 1 and not(demo:a)">
When type equals 1 element a is requred.
</xsl:if>
<xsl:if test="type = 2 and not(demo:b)">
When type equals 2 element b is requred.
</xsl:if>
</xsl:template>
</xsl:stylesheet>