Portál AbcLinuxu, 5. května 2025 02:55
Priklad: <resistor> … <value unit-prefix="k">10</value> … <resistor> <condensator> … <value unit-prefix="u">10</value> … </condensator>Zde konkretne element <value>, jednou muze jeho atribut unit-prefix nabyvat hodnot: m|R|k|M. Kdezto když je to u kondenzatoru, tak muze tento atribut nabyvat hodnot: m|u|n|p. Ted tvorim schema dle XML Schema (http://www.w3.org/2001/XMLSchema) a nevim jak mam definovat element value tak aby se rozlišilo, kde se element nachazi. Dekuji predem za pomoc! Tomas
<xsd:complexType name="rootType"> <xsd:sequence> <xsd:element name="resistor" type="resistorType" /> <xsd:element name="condensator" type="condensatorType" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="resistorType"> <xsd:sequence> <xsd:element name="value" type="valueType" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="condensatorType"> <xsd:sequence> <xsd:element name="value" type="valueType" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="valueType"> <xsd:simpleContent> <xsd:extension base="xsd:integer" use="required"> <xsd:attribute name="unit-prefix" type="unitsType" use="required" /> </xsd:extendsion> </xsd:simpleContent> </xsd:complexType> <xsd:simpleType="unitsType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="k" /> <xsd:enumeration value="M" /> <xsd:enumeration value="G" /> <xsd:enumeration value="T" /> <xsd:enumeration value="P" /> <xsd:enumeration value="E" /> <xsd:enumeration value="Y" /> <xsd:enumeration value="m" /> <xsd:enumeration value="u" /> <xsd:enumeration value="n" /> <xsd:enumeration value="p" /> <xsd:enumeration value="f" /> <xsd:enumeration value="a" /> <xsd:enumeration value="y" /> <xsd:enumeration value="d" /> <xsd:enumeration value="dk" /> <xsd:enumeration value="h" /> </xsd:restriction> </xsd:simpleType>
<ns:root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="http://hadrabap.googlepages.com/projects/xmlutilities/example.xsd" xsi:schemaLocation="http://hadrabap.googlepages.com/projects/xmlutilities/example.xsd file:/Users/petr/NetBeansProjects/xmlutilities/test/global/sandbox/xmlutilities/example.xsd"> <ns:resistor> <ns:value unit-prefix="k">12</ns:value> </ns:resistor> <ns:condensator> <ns:value> 12 </ns:value> </ns:condensator> <ns:other> <ns:value unit-prefix="xm">14</ns:value> </ns:other> <ns:resistor> <ns:value unit-prefix="M">13</ns:value> </ns:resistor> </ns:root>Kořenem je element root. V něm můžou být tyto elementy:
resistor
condensator
other
value
, který může obsahovat jen číselnou hodnotu (desetinné číslo). Element value
v elementu resistor
žere navíc atribut unit-prefix
, který může nabývat hodnot m
, R
, k
a M
. Element value
v elementu condensator
nemá žádný atribut. Element value
v elementu other
má též atribut unit-prefix
, ale s hodnotami xm
, xR
, xk
a xM
.
Schéma vypadá takto:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://hadrabap.googlepages.com/projects/xmlutilities/example.xsd" targetNamespace="http://hadrabap.googlepages.com/projects/xmlutilities/example.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xsd:element name="root" type="rootType" /> <xsd:complexType name="rootType"> <xsd:sequence minOccurs="0" maxOccurs="unbounded"> <xsd:choice> <xsd:element name="resistor" type="resistorType" /> <xsd:element name="condensator" type="condensatorType" /> <xsd:element name="other" type="otherType" /> </xsd:choice> </xsd:sequence> </xsd:complexType> <xsd:complexType name="resistorType"> <xsd:sequence> <xsd:element name="value"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:decimal"> <xsd:attribute name="unit-prefix" type="unitsType" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="condensatorType"> <xsd:sequence> <xsd:element name="value"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:decimal" /> </xsd:simpleContent> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="otherType"> <xsd:sequence> <xsd:element name="value"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:decimal"> <xsd:attribute name="unit-prefix" type="units2Type" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="unitsType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="m" /> <xsd:enumeration value="R" /> <xsd:enumeration value="k" /> <xsd:enumeration value="M" /> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="units2Type"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="xm" /> <xsd:enumeration value="xR" /> <xsd:enumeration value="xk" /> <xsd:enumeration value="xM" /> </xsd:restriction> </xsd:simpleType> </xsd:schema>Když si stáhneš XMLUtilities a do adresáře xmlutilities/test/global/sandbox/xmlutilities/ nahraješ soubory z přílohy, získáš další TestCase, pomocí kterého si můžeš hrát s tím schémátkem. Je to projekt NetBeans 6.1 a všechny knihovny jsou součástí distribuce knihovny. Vyžaduje to JavaSE 5 a vyšší. Tak snad jsem trošku pomohl. Dej vědět, co dál
<location> <coordinate name="x">20</coordinate> <coordinate name="y">50</coordinate> </location>nadefinovat to, aby se prvek coordinate mohl vyskytnout vicenasobne ale abynevznikla duplicitni definice u hodnoty atributu name. Cili nejak takto ne:
<location> <coordinate name="x">20</coordinate> <coordinate name="x">50</coordinate> <coordinate name="y">50</coordinate> </location>Dekuji Vam!
coordinate-x
, tak se podíváš, jestli je nadefinovaná a když jo, tak vyhučíš), nebo změnil strukturu XML (například mít dva elementy <coordinate-x />
a <coordinate-y />
bez toho atributu)…
Bohužel, i XML Schema má své limity a tohle není jediná. Například nejde udělat, že když má atribut někde v nějakym elementu nahoře tuhle hodnotu, tak někde dole musí být hodnota jiná :-/
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.