2009-05-31 9 views
1

Ich versuche, ein Element in einem XML-Schema zu erstellen, so dass nur Standard (X) HTML-Elemente als untergeordnete Elemente verwendet werden können. Was ich habe versucht, ist dies:Wie erstellen Sie ein Element in einem XML-Schema, das HTML-Elemente als untergeordnete Elemente zulässt?

<xs:element name="description"> 
    <xs:complexType> 
     <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
      <xs:any namespace="http://www.w3.org/1999/xhtml" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Natürlich ist dies nicht funktioniert, wie das folgende XML nicht explizit den Namensraum enthält:

<description> 
    <p>this is a test</p> 
    <p>this is a <b>bold</b> test</p> 
    <h1>Those were the tests</h1> 
</description> 

Muss ich den Namespace angeben müssen irgendwo im Dokument, oder kann ich es im Schema bekommen?

Antwort

1

Ihr Schema sieht ok. Beachten Sie, dass der Standardwert für xs: any/@ processContents strikt ist, was bedeutet, dass Ihre XHTML-Elemente ebenfalls überprüft werden. Sie müssen also auch ein XHTML-Schema haben und es aus Ihrem Schema importieren. Sie können processContents = "lax" in xs: any verwenden, um anzugeben, dass die Validierung nur angewendet wird, wenn ein Schema für diese Elemente vorhanden ist.

Ihr Problem ist in der Instanz, in der Sie den Namespace für das XHTML-Element angeben sollten. Sie können auf jedem Element, beispielsweise für den XHTML-Namespace als Standard-Namespace deklarieren

<p xmlns="http://www.w3.org/1999/xhtml">this is a test</p> 

oder Sie können es zu einem Präfix, h zum Beispiel und dann das Präfix Ihre XHTML-Elemente zu qualifizieren gebunden erklären:

<description xmlns:h="http://www.w3.org/1999/xhtml"> 
    <h:p>this is a test</h:p> 
    <h:p>this is a <b>bold</b> test</h:p> 
    <h:h1>Those were the tests</h:h1> 
</description> 

DTDs sind nicht namespace-fähig, und da Nameplace-Deklarationen nur Attribute sind, ist es möglich, ein festes xmlns-Attribut für ein Element zu deklarieren, um es automatisch in einen bestimmten Namespace einzufügen. XML-Schemas sind Namespace-bewusst, und Sie können keine Namespace-Deklaration als festes Attribut verwenden.

2

Ich glaube, Sie brauchen also die Content-Verarbeitung deaktivieren:

<xs:any namespace="http://www.w3.org/1999/xhtml" processContents="skip"/> 

Siehe section 5.5 in XML-Schema-Spezifikation (insbesondere die Beispiele)

+0

Ich hatte gehofft, dass es einen besseren Weg, als zu sagen „ignorieren“. – Eric

+0

Aber Sie müssen es ignorieren, weil es nicht gültig ist. Die Verwendung des korrekten Namespaces ist in XML nicht optional. –

+0

Ich hoffte, dass das Schema dem XML-Dokument mitteilen konnte, was der Namespace war. Wenn ich den Raum explizit angeben würde, wo würde ich das machen? – Eric

Verwandte Themen