XML-Anfänger: XML-Schemata Problem

Dickus

Grünschnabel
Hallo Leute,
bin gerade dabei mich in XML einzuarbeiten habe da etwas kurioses festgestellt.
Anstatt DTD setze ich auf XML-Schemata, also auf XSD-Dateien. Dabei habe ich
folgendes Problem:

Wenn ich die XSD-Datei nicht referenziere, läuft alles wie es soll.
Sobald ich aber die XSD-Datei in der XML-Datei referenziere, bekomme ich eine
Fehlermeldung, die ich nicht begreife.

Hier mal die "originale" XML-Datei: layout_01.xml

Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="layout_01.xsl" type="text/xsl"?>
<!-- <layout_01 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="layout_01.xsd"> -->
<layout_01>
    <kopfdaten>
        <style src="layout_01.css"/>
        <script src="layout_01.js"/>
    </kopfdaten>
</layout_01>
Die Datei ist well-formed, aber nicht valid.

Die Datei layout_01.xml wird ordnungsgemäß abgeareitet und generiert folgenden HTML-
Code:

Code:
<html xmlns:fo="http://www.w3.org/1999/XSL/Format">
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-16">
<title>
                    Layout_01
                </title>
<link type="text/css" rel="stylesheet" href="layout_01.css"><script type="text/javascript" src="layout_01.js">
//
                </script></head>
<body></body>
</html>

Wenn ich jetzt in der XML-Datei die dritte Zeile aus den Kommentaren herausnehmen und
die vierte Zeile in Kommentare setze, dann seht es ja so aus:

Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="layout_01.xsl" type="text/xsl"?>
<layout_01 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="layout_01.xsd">
<!-- <layout_01> -->
    <kopfdaten>
        <style src="layout_01.css"/>
        <script src="layout_01.js"/>
    </kopfdaten>
</layout_01>

Nun verweise ich in der XML-Datei auf die XSD-Datei.

Ich bekomme jetzt aber die Fehlermeldung: "Unexpected attribute 'src' in element 'style'"

Hier noch schnell die XSL-Datei und die XSD-Datei:

layout_01.xsl:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="layout_01">
        <html>
            <head>
                <title>
                    Layout_01
                </title>
                <xsl:element name="link">
                    <xsl:attribute name="type">text/css</xsl:attribute>
                    <xsl:attribute name="rel">stylesheet</xsl:attribute>
                    <xsl:attribute name="href"><xsl:value-of select="kopfdaten/style/@src"/></xsl:attribute>
                </xsl:element>
                <xsl:element name="script">
                    <xsl:attribute name="type">text/javascript</xsl:attribute>
                    <xsl:attribute name="src"><xsl:value-of select="kopfdaten/script/@src"/></xsl:attribute>
//
                </xsl:element>
            </head>
            <body/>
        </html>
    </xsl:template>
</xsl:stylesheet>

layout_01.xsd
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="layout_01">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="kopfdaten">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="style" type="xsd:string"/>
                            <xsd:element name="script" type="xsd:string"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

Hoffe, Ihr könnt einem Anfänger helfen. :)
Danke

Dickus
 
Ganz einfach: Du hast ja in Deinem "style" und "script"-Element ein Attribut "src". Dieses "src" hast Du nicht im Schema definiert, deswegen sagt er "Unexpected attribut src" (=Unerwartetes Attribut src).

Wenn Du dies noch tust, müßte es gehen:

Anstatt <xsd:element name="style" type="xsd:string"/> schreibe
Code:
<xsd:element name="style" type="xsd:string"/>
  <xsd:complexType>
    <xsd:attribute name="src" type="xsd:string"/>
  </xsd:complexType>
</xsd:element>

Entsprechend für das element "script".
 
Aaaarghhhh....*patsch*
Vielen herzlichen Dank !
Da habe ich nun wirklich gar nicht dran gedacht.

Werde dann mal fein weiterproggen. :))



Ach Du dickes Ei !
Da habe ich mich etwas zu früh gefreut.
irgendwie scheint es noch Probleme mit der Tiefe der Struktur zu geben.

Wenn ich es so mache:
Code:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<xsd:element name="index">
		<xsd:complexType>
			<xsd:sequence>
				
				<xsd:element name="kopfdaten">
					<xsd:complexType>
						<xsd:attribute name="src" type="xsd:string"/>
					</xsd:complexType>
				</xsd:element>
				
				<xsd:element name="titelleiste" type="xsd:string"/>
				<xsd:element name="style" type="xsd:string"/>
				<xsd:element name="script" type="xsd:string"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
</xsd:schema>
dann ist die XSD-Datei well-formed UND valid. Das ist natürlich gut.
Nur an der Stelle darf das Attribut nicht rein. In der XML-Datei meckert
XML-Spy dann natürlich auch herum.

Ich habe es nicht geschafft den vorgeschlagenen Code nach dem Element "style"
einzubauen. XML-Spy bietet an der Stelle auch gar nicht erst <xsd:complexType> an.

Vielleicht noch eine Lösung parat ? :)

Dickus
 
Zuletzt bearbeitet:
Also...
es gibt einen Unterschied wenn Du ein Element mit Attribut und ohne content definieren willst. Also sowas wie <kopfdaten src="bla/> Das geht so:
Code:
				<xsd:element name="kopfdaten">
					<xsd:complexType>
						<xsd:attribute name="src" type="xsd:string"/>
					</xsd:complexType>
				</xsd:element>

Mit Content, also <style src="abc">xyz</style> geht so:
Code:
				<xsd:element name="style">
				  <xsd:complexType>
				    <xsd:simpleContent>
				      <xsd:extension base="xsd:string">
					<xsd:attribute name="src" type="xsd:string"/>
				      </xsd:extension>
				    </xsd:simpleContent>
				  </xsd:complexType>
				</xsd:element>

Ich poste hier mal das komplette schema und die passende xml-datei, beide sind valid.

Code:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<xsd:element name="index">
		<xsd:complexType>
			<xsd:sequence>
				
				<xsd:element name="kopfdaten">
					<xsd:complexType>
						<xsd:attribute name="src" type="xsd:string"/>
					</xsd:complexType>
				</xsd:element>
				
				<xsd:element name="titelleiste" type="xsd:string"/>
				<xsd:element name="style">
				  <xsd:complexType>
				    <xsd:simpleContent>
				      <xsd:extension base="xsd:string">
					<xsd:attribute name="src" type="xsd:string"/>
				      </xsd:extension>
				    </xsd:simpleContent>
				  </xsd:complexType>
				</xsd:element>			
				<xsd:element name="script" type="xsd:string"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
</xsd:schema>

Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd">
	<kopfdaten src="blabla"/>
	<titelleiste>bla</titelleiste>
	<style src="attribut">xxx</style>
	<script>ddd</script>
</index>


Wenn Du <kopfdaten> ebenfalls mit content erlauben möchtest, ändere es entsprechend.
 
Zurück