Обновление: OP отредактировал вопрос, чтобы удалить использование xs:assert
и заявил в комментариях, что валидация должна иметь место на C #. Ответ на вопрос OP теперь становится следующим:
Вы не можете принудительно применять ограничение, которое изменяет необходимость элемента на основе значения атрибута с использованием XSD 1.0, а Microsoft не поддерживает XSD 1.1, поэтому вы должны либо отключить ваши ограничения или проверить их вне вашего XSD.
(Сохранен для будущих читателей)
Вы близки, но ваше утверждение
<xs:assert test="count(./PackageArg[@type eq 'Batch']) eq 1"/>
проверяет @type
на PackageArg
, когда оно должно проверяться на @Type
на Application
.
Следующий XSD проверит ваш XML и выполнит ваши зависимые от атрибута требования:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="Applications">
<xs:complexType>
<xs:sequence>
<xs:element name="Application" maxOccurs="unbounded" minOccurs="1">
<xs:complexType>
<xs:all>
<xs:element type="xs:string" name="ProjectDirName"/>
<xs:element type="xs:string" name="Project" minOccurs="0"/>
<xs:element type="xs:string" name="Version" minOccurs="0"/>
<xs:element type="xs:string" name="PackageArg" minOccurs="0"/>
<xs:element type="xs:string" name="OutputDirName"/>
</xs:all>
<xs:attribute type="xs:string" name="Name" use="optional"/>
<xs:attribute name="Type" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Web"/>
<xs:enumeration value="Batch"/>
<xs:enumeration value="Service"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:assert test="PackageArg or @Type != 'Batch'"/>
<xs:assert test="Version or @Type != 'Service'"/>
<xs:assert test="Project or not(@Type = 'Web' or @Type = 'Service')"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Имейте в виду, что Microsoft не поддерживает XSD 1.1. (Вы отметили свой вопрос «msxml»).
Хотя это не тестируется...
docs.Sort((x, y) => y.StoredDate.CompareTo(x.StoredDate));
должна быть противоположность того, что Вы первоначально имели.
docs.Sort((x, y) => y.StoredDate.CompareTo(x.StoredDate));
Должен сделать то, что Вы ищете.
docs.Sort((x, y) => -x.StoredDate.CompareTo(y.StoredDate));
Примечание знак "минус".