From: Gregoor, Van Der Eyken (geyken@esual.com)
Date: 20/09/2001 - 10:09
Un autre exercice interressant, depuis un Schema ( utilisant des
xsd:element locaux etou globaux j'aimerais construire l'interface HTML
correspondante, pour cela j'utilise un élement racine nommé.
Le problème est le suivant :
Le elements ( ou attributs ) ne possedant pas de type, c'est à dire
conteneurs, crée une <table>, les autres suivant leurs types et la
cardinalité creent soit un input ou un select...
J'arrive à parser de manière locale ( et encore qd le dernier element
il y a une erreur pour aller au parent suivant ) et j'aimerais
appliquer ce raisonement aussi avec des éléments appelés.
exemple Schéma
<?xml-stylesheet type="text/xsl" href="E:\services\htm.xsl"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
elementFormDefault="qualified">
<xsd:element name="racine">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="patient"
maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element
name="name" type="xsd:string"/>
<xsd:element
name="address">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="apt">
<xsd:complexType/>
</xsd:element>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zip" type="xsd:string"/>
<xsd:element ref="phone"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element
name="birthdate" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute
name="patientID" use="required" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="phone">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="mobile"
type="xsd:string"/>
<xsd:element name="home"
type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
exemple XSL
<?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"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema">
<xsl:output method="html"/>
<xsl:param name="page" select="'racine'"/>
<xsl:template match="/">
<xsl:text
disable-output-escaping="yes"><![CDATA[<html><body>]]></xsl:text>
<xsl:apply-templates select="descendant::node()[ (
name()='xsd:element') and @name=$page] " mode="conteneur"/>
<xsl:text
disable-output-escaping="yes"><![CDATA[</body></html>]]></xsl:text>
</xsl:template>
<xsl:template match="node()" mode="conteneur">
<xsl:if test="name()='xsd:attribute'">
<xsl:apply-templates mode="simple" select="."/>
</xsl:if>
<xsl:if test="name()='xsd:element'">
<xsl:choose>
<xsl:when test="not(@type)">
<xsl:text
disable-output-escaping="yes"><![CDATA[<table datasrc='#xmldso'
border='1' width="100%" name="]]></xsl:text>
<xsl:value-of select="@name"/>
<xsl:text
disable-output-escaping="yes"><![CDATA["><tr><td>]]></xsl:text>
<xsl:value-of select="@name"/>
</xsl:when>
<xsl:when test="@type">
<xsl:apply-templates
mode="simple" select="."/>
</xsl:when>
<xsl:when test="@ref"/>
</xsl:choose>
</xsl:if>
<xsl:if test="child::node()">
<xsl:apply-templates mode="conteneur"
select="child::node()"/>
</xsl:if>
<xsl:if test="not(child::node())">
<xsl:if test="following-sibling::node()">
<xsl:apply-templates mode="conteneur"
select="following-sibling[1]"/>
</xsl:if>
<xsl:if
test="position()=last()[name()='xsd:element' or
name()='xsd:attribute']">
<xsl:text
disable-output-escaping="yes"><![CDATA[</td></tr></table>]]></xsl:text>
<xsl:apply-templates mode="conteneur"
select="following-sibling[1]/parent::node()"/>
</xsl:if>
</xsl:if>
</xsl:template>
<xsl:template match="node()" mode="simple">
<xsl:text
disable-output-escaping="yes"><![CDATA[<tr><td>]]></xsl:text>
<xsl:value-of select="@name"/>
<xsl:text disable-output-escaping="yes"><![CDATA[:
<input type=text datafld="]]></xsl:text>
<xsl:value-of select="@name"/>
<xsl:text disable-output-escaping="yes"><![CDATA["
name="]]></xsl:text>
<xsl:value-of select="@name"/>
<xsl:text
disable-output-escaping="yes"><![CDATA["></td></tr>]]></xsl:text>
</xsl:template>
<xsl:template match="node()" mode="list">
<xsl:text
disable-output-escaping="yes"><![CDATA[<tr><td>]]></xsl:text>
<xsl:value-of select="@name"/>
<xsl:text disable-output-escaping="yes"><![CDATA[:
<select type=text datafld="]]></xsl:text>
<xsl:value-of select="@name"/>
<xsl:text disable-output-escaping="yes"><![CDATA["
name="]]></xsl:text>
<xsl:value-of select="@name"/>
<xsl:text
disable-output-escaping="yes"><![CDATA["></td></tr>]]></xsl:text>
</xsl:template>
</xsl:stylesheet>
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Archive générée par hypermail 2.1.3 le 28/06/2004 - 11:06 UTC
webmaster@xmlfr.org
|