parameterabhängige Attribute in XML-Schema

elkassi

Mitglied
Hallo,

mir fiel kein besserer Titel dafür ein. Mein Problem:

Ich möchte folgende Struktur mittels XML-Schema beschreiben:

Code:
<el1 lang="de">
  <el2 attr1="inhalt1">
  <el2 attr1="inhalt2">
</el1>

<el1 lang="en">
  <el2 attr1="inhalt2">
  <el2 attr1="inhalt3">
</el1>
wobei: Werte für attr1 sind vorgegeben (enumeration) und können sein: inhalt1, inhalt2, inhalt3
ABER: wenn der Vaterknoten (oder evtl. das Root-Element) das (required) Attribut lang="de" hat, dann sind nur inhalt1 und inhalt2 zugelassen, bei "en" ist es inhalt2 und inhalt3, inhalt4 usw.
Also: zulässige Attributwerte in Abhängigkeit von Werten des XML-Dokumentes definieren. Die Werte für lang sind ebenfalls vorgegeben (im Schema bekannt).

Hat jemand eine Idee?

Dank und Gruß
ElKassi
 
Hallo!

Ich denke diese Form der Validierung ist mit "normalen" XML Mitteln nicht möglich. Aber sollte diese Überprüfung (beim Schreiben/Lesen) nicht von deiner Anwendung übernommen werden?

Gruß Tom
 
Ne, nicht unbedingt.

Geht im Prinzip auch darum, einen guten XML-Editor zur Eingabe zu verwenden, welcher dann die gültigen Attributwerte zur Auswahl liefert.

Schade, wenn XML das nicht vorsieht.
Bei xs:selector wertet er ja auch einen xpath-Ausdruck aus, der sich auf den Kontextknoten bezieht. Mein Anwendung muss daher auch nicht auf Eindeutigkeit prüfen (bei Keys z.B.). Daher dachte ich, dass sowas hier auch möglich wäre.

:(

Dank und Gruß
ElKassi
 
Hallo,

ich bin mir jetzt gar nicht mehr so sicher ob das ganze wiklich nicht geht....
mein Testdokument:

data.xml:
Code:
<?xml version="1.0"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="data.xsd">
	<elem lang="de">
		<subelem attr1="inhalt1"/>
		<subelem attr1="inhalt2"/>
	</elem>
	<elem lang="en">
		<subelem attr1="inhalt2"/>
		<subelem attr1="inhalt3"/>
	</elem>
</root>

data.xsd:
Code:
<?xml version="1.0" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="subelem">
		<xs:complexType>
			<xs:attribute name="attr1" type="xs:string" use="required"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="elem">
		<xs:complexType>
                	<xs:sequence>
				<xs:element ref="subelem" minOccurs="0" maxOccurs="unbounded"/>
			</xs:sequence>
			<xs:attribute name="lang">
                               <xs:simpleType>
         			    <xs:restriction base="xs:string">
    					<xs:enumeration value="de"/>
                                    	<xs:enumeration value="en"/>
                                    </xs:restriction>
                                </xs:simpleType>
			</xs:attribute>
		</xs:complexType>
	</xs:element>
	<xs:element name="root">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="elem" minOccurs="0" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

Du könntest es mal damit versuchen aus dem einen Element "subelem" zwei zu machen mit jeweils anderer Attribute-Basis. Die Einschränkung von einem Element abhänig vom umgebenden Kontext (Attributwert des Parent-Elements) stelle ich mir machbar vor, auch wenn ich derweil leider nicht weis wie.

HTH,
Gruß Tom
 
Zuletzt bearbeitet:
Zurück