XML Więcej szczegółowych sprawdzania przez XSD Assert


Jest to schemat, który potrzebuję, aby sprawdzić, aby zatwierdzić, że jeśli reguła/typ jest A lub
B
, a następnie
Return = True
w czymś w rodzaju:
<xsd:assert test="if (@type$value = A or @type$value= B) then @return$value = true"/>

to jest XSD, nad którym już pracowałem:
<xsd:schema xmlns:xsd="[url=http://www.w3.org/2001/XMLSchema">]http://www.w3.org/2001/XMLSchema">[/url]
<xsd:simpleType name="Rule">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="A"/>
<xsd:enumeration value="B"/>
<xsd:enumeration value="C"/>
<xsd:enumeration value="D"/>
<xsd:enumeration value="E"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="cType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="C-val1"/>
<xsd:enumeration value="C-val2"/>
<xsd:enumeration value="C-val3"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="DType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="D-val1"/>
<xsd:enumeration value="D-val2"/>
<xsd:enumeration value="D-val3"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="Rule">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="Type" type="Rule"/>
<xsd:element name="Return" type="xsd:boolean"/>
<xsd:choice>
<xsd:element name="BConfig"/>
<xsd:element name="AConfig"/>
<xsd:element name="CConfig" type="CRule"/>
<xsd:element name="DConfig" type="DRule"/>
<xsd:element name="EElement" type="xsd:integer"/>
</xsd:choice>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="CRule">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="C" type="CType" maxOccurs="3"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="DRule">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="D" type="DType" maxOccurs="3"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>

Ale nie wiem, jak prawidłowo korzystać z zasobu
UPDATE 1:
po sergiofc jest to zaktualizowany schemat
<xsd:schema xmlns:xsd="[url=http://www.w3.org/2001/XMLSchema">]http://www.w3.org/2001/XMLSchema">[/url]
<xsd:simpleType name="Rule">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="A"/>
<xsd:enumeration value="B"/>
<xsd:enumeration value="C"/>
<xsd:enumeration value="D"/>
<xsd:enumeration value="E"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="cType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="C-val1"/>
<xsd:enumeration value="C-val2"/>
<xsd:enumeration value="C-val3"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="DType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="D-val1"/>
<xsd:enumeration value="D-val2"/>
<xsd:enumeration value="D-val3"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="Rule">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="Type" type="Rule"/>
<xsd:element name="Return" type="xsd:boolean"/>
<xsd:choice>
<xsd:element name="BConfig"/>
<xsd:element name="AConfig"/>
<xsd:element name="CConfig" type="CRule"/>
<xsd:element name="DConfig" type="DRule"/>
<xsd:element name="EElement" type="xsd:integer"/>
</xsd:choice>
</xsd:sequence>
<xsd:assert test="if (Type = ('A', 'B')) then Return = true() else true()"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="CRule">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="C" type="CType" maxOccurs="3"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="DRule">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="D" type="DType" maxOccurs="3"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>

ale nadal nie wiem, gdzie znaleźć
xsd: assert
, nadal pojawia się ten sam błąd.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli dobrze rozumiem, chcesz wartość
Powrót
, aby być prawdą, jeśli Typ Wartość jest A lub
B
. Jeśli tak, możesz użyć tego oświadczenia:
<xsd:assert test="if (Type = ('A', 'B')) then Return = true() else true()"/>

Wyjaśnienie:
  • Musisz użyć
    @name
    , aby otrzymać atrybut nazwy Nazwa Nie musisz używać
    @
    , jeśli wybierzesz element
    Nazwa
    Wystarczająco, aby wybrać element o nazwie nazwę .
  • $ value
    to zmienna, która występuje tylko w
    & < xs: assertion & >
    dla prostych wartości, ale nie występuje w
    & lt ; xs: assert & >
    .
  • W XPath,
    Wartość> Val2 '= ("Wartość", "Val2", "Val3")
    Zwraca TRUE, jeśli niektóre elementy po lewej jest obecny w odpowiedniej kolejności., Chociaż twoje lub podejście jest również dopuszczalne.

Jeśli chcesz, możesz przeczytać specyfikacje XPath lub samouczek XPath, aby uzyskać najlepszą wiedzę na ten temat.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Postępuj zgodnie z tym przykładem:
Zajmuje się testami warunkowymi.
<xs:complexType name="ProductType">
<xs:sequence>
<xs:element name="number" type="xs:integer"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="size" type="xs:integer"/>
</xs:sequence>
<xs:attribute name="dept" type="xs:string"/>
<xs:assert test="if (@dept = 'ACC')
then number > 500
else if (@dept = 'WMN')
then number &<= 300 and number > 200
else if (@dept = 'MEN')
then number &< 200
else false()"/>
</xs:complexType>

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się