Portál AbcLinuxu, 31. října 2025 14:35
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:
resistorcondensatorothervalue, 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.