none
présenter un arbre avec document xsl RRS feed

  • Question

  • Bonjour tout le monde,

    Je travail depuis un moment (donc je ne saurai dire si j'ai un niveau débutant ou plus) avec des documents xml pour représenter des arbres avec des noeuds typés. En quelque sorte un arbre est une requête ou les noeud sont des opérateurs algébriques pour vérifier la validité de cet arbre j'ai définit un XML-Schema.

    Voici un exemple d'arbre que je peux construire en xml 

     

    <?xml version="1.0" encoding="utf-8" ?>
    <SymbolicQuery xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
            xs:noNamespaceSchemaLocation="SymbolicQueryXSchema.xsd"
            Name="symExpression"
            StreamResults="true" UserName="dbo" Trace="false" Version="1.0"
            OutputDBName="ImageDB" OutputResumeName="res" OutputInstanceName="SQLSERVER2008"
            OutputServerName="These">
     <CartesianProduct>
      <Nest ConceptVariables="Class" AgregateVariables="fonction(BlueHiso)">
       <Projection SelectSymbolicVariables="BlueHiso;Class">
        <Scan InputDBName="SymbolicImageDB" UserNameForScan="dbo" InputInstanceName="SQLSERVER2008"
           InputServerName="These" InputTableName="ResumeImage10"
           InputConceptVariableNames="Num" InputPartitionAttributName="Pop" InputKeyAttributName="">
        </Scan>
       </Projection>
      </Nest>
      <Scan InputDBName="SymbolicImageDB" UserNameForScan="dbo" InputInstanceName="SQLSERVER2008"
         InputServerName="These" InputTableName="ResumeImage10"
         InputConceptVariableNames="Num" InputPartitionAttributName="Pop" InputKeyAttributName="">
      </Scan>
     </CartesianProduct>
    </SymbolicQuery>
    

     

    ce document est controlé par ce xml-schema

     

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema attributeFormDefault="unqualified"
          elementFormDefault="qualified"
          xmlns:xs="http://www.w3.org/2001/XMLSchema">
     
     <xs:element name="SymbolicQuery">
      <xs:complexType>
       <xs:group ref="OneSymbolicOperator"/>
       <xs:attribute name="Name" type="xs:string" use="required" />
       <xs:attribute name="Version" type="xs:string" use="required" />
       <xs:attribute name="OutputInstanceName" type="xs:string" use="required" />
       <xs:attribute name="OutputServerName" type="xs:string" use="required" />
       <xs:attribute name="OutputDBName" type="xs:string" use="required" />
       <xs:attribute name="UserName" type="xs:string" use="required" />
       <xs:attribute name="OutputResumeName" type="xs:string" use="required" />
       <xs:attribute name="StreamResults" type="xs:boolean" use="required" />
       <xs:attribute name="Trace" type="xs:string" use="optional" />
       <xs:attribute name="TraceTableName" type="xs:string" use="optional" />
      </xs:complexType>
     </xs:element>
     
     <xs:group name="OneSymbolicOperator">
      <xs:choice>
       <xs:element name="Scan" 
             type="Scan" 
             maxOccurs="1"/>
       <xs:element name="Projection" 
             type="Projection" 
             maxOccurs="1"/>
       <xs:element name="Nest" 
             type="Nest" 
             maxOccurs="1"/>
       <xs:element name="CartesianProduct" 
             type="CartesianProduct" 
             maxOccurs="1"/>
      </xs:choice>
     </xs:group>
    
     <xs:complexType name="Scan">
      <xs:simpleContent>
       <xs:extension base="xs:string">
        <xs:attribute name="InputInstanceName" 
               type="xs:string" 
               use="required" />
        <xs:attribute name="InputServerName" 
               type="xs:string" 
               use="required" />
        <xs:attribute name="InputDBName" 
               type="xs:string" 
               use="required" />
        <xs:attribute name="UserNameForScan" 
               type="xs:string" 
               use="required" />
        <xs:attribute name="InputTableName" 
               type="xs:string" 
               use="required" />    
        <xs:attribute name="InputPartitionAttributName" 
               type="xs:string" 
               use="required" />
        <xs:attribute name="InputConceptVariableNames" 
               type="xs:string" 
               use="required" />
        <xs:attribute name="InputKeyAttributName" 
               type="xs:string" 
               use="required" />
    		<xs:attribute name="InternalName" 
    					 type="xs:string" 
    					 use="optional" />
        </xs:extension>
      </xs:simpleContent>
     </xs:complexType>
    
     <xs:complexType name="Projection">
      <xs:group ref="OneSymbolicOperator"/>
      <xs:attribute name="SelectSymbolicVariables" type="xs:string" use="optional" />
      <xs:attribute name="ComputeSymbolicVariables" type="xs:string" use="optional" />
    	 <xs:attribute name="InternalName" type="xs:string" use="optional" />
     </xs:complexType>
    
     <xs:complexType name="Nest">
      <xs:group ref="OneSymbolicOperator"/>
      <xs:attribute name="ConceptVariables" type="xs:string" use="required" />
      <xs:attribute name="AgregateVariables" type="xs:string" use="required" />
    	 <xs:attribute name="InternalName" type="xs:string" use="optional" />
     </xs:complexType>
    
     <!--Binaire operators-->
     <xs:complexType name="CartesianProduct">
      <xs:sequence>
       <xs:group ref="OneSymbolicOperator"/>
       <xs:group ref="OneSymbolicOperator"/>
      </xs:sequence>
    	 <xs:attribute name="InternalName" type="xs:string" use="optional" />
     </xs:complexType>
    </xs:schema>
    

     

    Je souhaite développer un petit fichier xsl pour pouvoir présenter un document xml sous forme d'arbre :  identifier dynamiquement les noeuds de cet arbre. 

     

    Mon problème est le suivant,

    Ce que je trouve une peu dure, c'est le comment définir un traitement récursif (pour identifier dynamiquement les noeuds) d'un template dans un xsl pour présenter un arbre.

    pour l'instant, je ne cherche pas à faire des choses compliquées, un tableau emboité par hauteur des noeuds de l'arbre serait déjà très bien. Si tout marche bien, je pourrais essayer de faire des choses plus compliquées qui ressemblent plus à un arbre grâce au html 5 :) 

    J'espère que ce que je souhaite faire en xsl est humainement possible :)

    Merci de votre aide :)

     

     


    PhD - Student
    mardi 31 août 2010 15:42

Réponses

  • Bonjour,

    C'est certainement possible, l'attribut match des documents XSLT demande une requête XPath auquel vous pouvez appliquer des instructions spéciales telle que : "following-sibling" (http://www.zvon.org/xxl/XPathTutorial/Output/example15.html) et ainsi de suite.

    Si je peux me permettre, vous partez dans la mauvaise direction (c'est mon point de vue). En effet, vous souhaitez utiliser XSLT sur un schéma XSD en pensant que ce dernier le "méta-schéma" de vos données. Ce qui est faux...

    XSD permet de décrire un méta-schéma d'un document XML. XML permet de décrire vos données. Il faut voir XSD et XML comme des outils.

    Si vous souhaitez représenter des méta-données de votre propre données, et bien écrivez les en XML ! Et non en XSD...

    Par exemple :

    <GenericNode Type="Projection">
      <GenericNode Type="Scan">
       ...
      </GenericNode><br/></GenericNode>
    

    Il vous sera plus simple d'écrire un document XSLT permettant de transformer ce document XML. Crée un XSD si nécessaire pour valider votre "méta-schéma"...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse OmarioS jeudi 16 septembre 2010 10:57
    mardi 7 septembre 2010 15:01
    Modérateur

Toutes les réponses

  • Bonjour,

    Quel type de document va être généré à la fin ? XHTML ? Comment allez-vous représenter votre arbre si c'est un document XHTML ? (Avec des puces imbriquées ? Des images).

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 1 septembre 2010 09:37
    Modérateur
  • Je ne connais pas trop la différence entre XHTML 2 et le HTML 5, mais j'ai vu que dernièrement on(*) met en avant d'éventuelles qualités du HTML 5 pour présenter visuellement les données ... du coup je choisirais le HTML 5 

    pour la représentation de l'arbre, mon objectif final est d'avoir ce style (première image de la page). Un noeud de mon arbre est un rectangle (affichant le type du noeud et les valeurs de ses attributs XML) et à l'intérieur il contient ses noeuds fils. 

    J'avoue que ce design est un peu trop avancé (pour moi). Donc, dans un premier temps je me contente d'avoir mon arbre avec des puces imbriquées. Ensuite, je vais essayer de travailler pour changer le model visuel. 

    Merci de votre aide :)

     

    * microsoft http://ie.microsoft.com/testdrive/

    google http://studio.html5rocks.com/

    et apple http://www.apple.com/html5/?aosid=p204&siteid=403761&program_id=2701&cid=OAS-EMEA-AFF&tduid=672c6d486db243a1eb8dfa3714172927


    PhD - Student
    • Marqué comme réponse OmarioS mardi 7 septembre 2010 14:05
    • Non marqué comme réponse OmarioS mardi 7 septembre 2010 14:05
    mercredi 1 septembre 2010 11:55
  • Bonjour,

    Voici un exemple de parcourt de votre document XML (Element CartesianProduct suivit de Nest) :

     <xsl:template match="CartesianProduct">
      <ul>
       <!-- Contenu du noeud-->
       <xsl:apply-templates select="Nest" />
      </ul>
     </xsl:template>
    
     <xsl:template match="Nest">
      <li>Blabla</li>
     </xsl:template>
    

    Est-ce que cette exemple vous aide ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    lundi 6 septembre 2010 08:55
    Modérateur
  • Merci pour votre réponse Gilles.

    En faite votre solution ne m'aide pas vraiment : le document xml que j'ai donné est un cas particulier qui correspond au schema xml, et donc la réponse que vous m'avez fournir n'est valable que pour ce document xml.

    Or, je peux avoir plusieurs autres exemplex de documents xml qui satisfont ce même schéma, notamment

    <?xml version="1.0" encoding="utf-8" ?>
    <SymbolicQuery xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
        xs:noNamespaceSchemaLocation="SymbolicQueryXSchema.xsd"
        Name="symExpression"
        StreamResults="true" UserName="dbo" Trace="false" Version="1.0"
        OutputDBName="ImageDB" OutputResumeName="res" OutputInstanceName="SQLSERVER2008"
        OutputServerName="These">
    <Projection SelectSymbolicVariables="BlueHiso;Class">
     <Nest ConceptVariables="Class" AgregateVariables="fonction(BlueHiso)">
      <Scan InputDBName="SymbolicImageDB" UserNameForScan="dbo" InputInstanceName="SQLSERVER2008"
        InputServerName="These" InputTableName="ResumeImage10"
        InputConceptVariableNames="Num" InputPartitionAttributName="Pop" InputKeyAttributName="">
      </Scan>
     </Nest>
    </Projection>
    </SymbolicQuery>
    

    et dans ce cas, votre réponse n'est plus valable.

    Par contre, ce que je cherche c'est une solution récursive (template recursif ?) pour traiter n'importe quel document qui satisfait le xml-schema. L'idée est de monter en niveau d'abstraction et au lieu de traiter un document xml, c'est de traiter son xml-schema. 

    Cordialement


    PhD - Student
    lundi 6 septembre 2010 13:17
  • Bonjour,

    C'est certainement possible, l'attribut match des documents XSLT demande une requête XPath auquel vous pouvez appliquer des instructions spéciales telle que : "following-sibling" (http://www.zvon.org/xxl/XPathTutorial/Output/example15.html) et ainsi de suite.

    Si je peux me permettre, vous partez dans la mauvaise direction (c'est mon point de vue). En effet, vous souhaitez utiliser XSLT sur un schéma XSD en pensant que ce dernier le "méta-schéma" de vos données. Ce qui est faux...

    XSD permet de décrire un méta-schéma d'un document XML. XML permet de décrire vos données. Il faut voir XSD et XML comme des outils.

    Si vous souhaitez représenter des méta-données de votre propre données, et bien écrivez les en XML ! Et non en XSD...

    Par exemple :

    <GenericNode Type="Projection">
      <GenericNode Type="Scan">
       ...
      </GenericNode><br/></GenericNode>
    

    Il vous sera plus simple d'écrire un document XSLT permettant de transformer ce document XML. Crée un XSD si nécessaire pour valider votre "méta-schéma"...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse OmarioS jeudi 16 septembre 2010 10:57
    mardi 7 septembre 2010 15:01
    Modérateur
  • C'est noté.

    Merci Gilles pour vos retours.


    PhD - Student
    jeudi 16 septembre 2010 10:56