2010-06-30 7 views
1

J'ai un jeu de résultats xml qui doit être converti en utilisant XSL pour l'affichage dans une feuille de calcul Excel dans une application vb.net. Le jeu de résultats xml a 15 colonnes (15 propriétés du client comme le prénom, le nom, l'adresse, etc.) et je ne veux pas coder en dur l'attribut select de xsl/xpath avec les noms d'éléments xml ou property. J'ai besoin d'un XSL qui peut transformer le xsl en lignes et en colonnes sans connaître les noms des colonnes ni aucun codage en dur. Rendre les en-têtes gras est préférable J'ai essayé de le faire et atteint un certain point mais loin du résultat final. S'il vous plaît aider à atteindre cetXSL pour convertir toutes les lignes et colonnes de XSL pour l'exportation vers Excel. looping dynamique

Voici l'entrée XML

<?xml version="1.0" encoding="utf-8"?> 
<ClientArray> 
<Client> 
<LastName>Bill</LastName> 
<FirstName>Gates</FirstName> 
<MiddleName/> 
<Suffix/> 
<DateOfBirth>30-May-1968</DateOfBirth> 
<PlaceOfBirth/> 
<SSN>n/a</SSN> 
<Gender>Male</Gender> 
<City>SHELTON</City> 
<State>WA</State> 
<Zip>96484</Zip> 
</Client> 
<Client> 
<LastName>Warron</LastName> 
<FirstName>Buffet</FirstName> 
<MiddleName>P</MiddleName> 
<Suffix/> 
<DateOfBirth>12-Aug-1957</DateOfBirth> 
<PlaceOfBirth>Mississippi</PlaceOfBirth> 
<SSN>n/a</SSN> 
<Gender>Male</Gender> 
<City>Missi</City> 
<State>KS</State> 
<Zip>66096</Zip> 
</Client> 
<Client> 
<LastName>Steev</LastName> 
<FirstName>Jobbs</FirstName> 
<MiddleName/> 
<Suffix/> 
<DateOfBirth>19-Apr-1959</DateOfBirth> 
<PlaceOfBirth>Cupertino</PlaceOfBirth> 
<SSN>n/a</SSN> 
<Gender>Male</Gender> 
<City>Cupertino</City> 
<State>CA</State> 
<Zip>96066</Zip> 
</Client> 
</ClientArray> 

c'est le code que j'ai

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<HTML> 
<HEAD> 
<STYLE type="text/css"> TABLE{table-layout: automatic; width:100%} .tblHeader{background-color:RGB(192,192,192);font-weight:bold} .row1{background-color:RGB(204,204,255)} .row2{background-color:RGB(153,204,255)} </STYLE> 
</HEAD> 
<BODY> 
<TABLE border="1"> 

<!-- Global variable to get column count --> 
    <xsl:variable name="columns" select="number(/list/@columns)"/> 

<THEAD> 
<TR class="tblHeader"> 
    <xsl:for-each select="ClientArray/Client"> 
     <TD>name()</TD> <!-- {Getting the xml column header here} --> 
    </xsl:for-each> 
</TR> 
</THEAD> 

<TBODY> 
<xsl:for-each select="ClientArray/Client"> 
<TR> 
<xsl:choose> 

<xsl:when test="position() mod 2 = 1"> 
<xsl:attribute name="class">row1</xsl:attribute> 
</xsl:when> 
<xsl:otherwise> 
<xsl:attribute name="class">row2</xsl:attribute> 
</xsl:otherwise> 
</xsl:choose> 

<xsl:for-each select="."> 
<TD> 
<xsl:value-of select="./*[count(child::*) = 0]"/> 
</TD> 
</xsl:for-each> 


</TBODY> 
</TABLE> 
</BODY> 
</HTML> 

</xsl:template> 
</xsl:stylesheet> 

Ma sortie désirée est

MiddleName LastName FirstName Suffixe etc .... Bill Gates
Buffet Warren

Fondamentalement, le XML doit être converti en une table simple qui pourrait être exportée vers EXCEL. Leur clé est que je ne veux pas de codage en dur sur l'attribut xpath "select" de sorte que si j'ajoute plus de champs de saisie, XSL fonctionne sans problème. le xsl devrait faire une boucle pour toutes les colonnes sans connaître les noms des colonnes

+0

J'ai corrigé votre formatage - vous devez indenter le code 4 espaces, ou SO le modifiera surtout s'il contient du HTML ou du XML. –

+0

Aussi, s'il vous plaît modifier votre question et ajouter des exemples de l'entrée XML et la sortie désirée. –

+0

Vous avez oublié de fournir le document XML source et le résultat attendu! –

Répondre

1

Préserver votre processus axé sur for-each:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <HTML> 
      <HEAD> 
       <STYLE type="text/css"> TABLE{table-layout: automatic; width:100%} .tblHeader{background-color:RGB(192,192,192);font-weight:bold} .row1{background-color:RGB(204,204,255)} .row2{background-color:RGB(153,204,255)} </STYLE> 
      </HEAD> 
      <BODY> 
       <TABLE border="1"> 
        <THEAD> 
         <TR class="tblHeader"> 
          <xsl:for-each select="*/*[1]/*"> 
           <TH> 
            <xsl:value-of select="name()"/> 
           </TH> 
           <!-- {Getting the xml column header here} --> 
          </xsl:for-each> 
         </TR> 
        </THEAD> 
        <TBODY> 
         <xsl:for-each select="ClientArray/Client"> 
          <TR> 
           <xsl:attribute name="class"> 
            <xsl:choose> 
             <xsl:when test="position() mod 2 = 1">row1</xsl:when> 
             <xsl:otherwise>row2</xsl:otherwise> 
            </xsl:choose> 
           </xsl:attribute> 
           <xsl:for-each select="*"> 
            <TD> 
             <xsl:value-of select="."/> 
            </TD> 
           </xsl:for-each> 
          </TR> 
         </xsl:for-each> 
        </TBODY> 
       </TABLE> 
      </BODY> 
     </HTML> 
    </xsl:template> 
</xsl:stylesheet> 

Remarque: Je reviendrai plus tard avec une feuille de style "de style XSLT".

Modifier: J'étais pressé. La clé était pour ma réponse à venir. Pardon.

Édition 2: Ajout de la feuille de style dans le "style XSLT".

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/ClientArray"> 
     <HTML> 
      <HEAD> 
       <STYLE type="text/css"> TABLE{table-layout: automatic; width:100%} .tblHeader{background-color:RGB(192,192,192);font-weight:bold} .row1{background-color:RGB(204,204,255)} .row2{background-color:RGB(153,204,255)} </STYLE> 
      </HEAD> 
      <BODY> 
       <TABLE border="1"> 
        <THEAD> 
         <TR class="tblHeader"> 
          <xsl:apply-templates select="Client[1]/*" mode="headers"/> 
         </TR> 
        </THEAD> 
        <TBODY> 
         <xsl:apply-templates/> 
        </TBODY> 
       </TABLE> 
      </BODY> 
     </HTML> 
    </xsl:template> 
    <xsl:template match="Client"> 
    <TR class="row{2 - position() mod 2}"> 
      <xsl:apply-templates/> 
     </TR> 
    </xsl:template> 
    <xsl:template match="Client/*" mode="headers"> 
     <TH> 
      <xsl:value-of select="name()"/> 
     </TH> 
    </xsl:template> 
    <xsl:template match="Client/*"> 
     <TD> 
      <xsl:value-of select="."/> 
     </TD> 
    </xsl:template> 
</xsl:stylesheet> 

Remarque: Ces feuilles de style supposent que tous les enfants de Client éléments sont les mêmes et sont dans le même ordre. Je reviendrais avec une solution plus générale si vous le souhaitez.

+0

Salut Alejandro, La solution que vous m'avez donnée était excellente/super. Cela a fonctionné à 100% pour moi. Merci beaucoup. Tu m'as sauvé toute une vie. Je vous ferai savoir si j'ai besoin de plus de raffinement. Je pense que j'ai besoin. Merci encore – Enggr

+0

@Enggr: Je suis content que cela vous aide. N'oubliez pas de fournir des entrées et des sorties dans vos questions. Aussi, si c'est la bonne solution pour vous, vous devez marquer comme réponse afin d'aider les autres. –

+0

Ok, je vais fournir des entrées/sorties à partir de maintenant. Je vais marquer cela comme une réponse pour aider les autres. (Aussi les gens sauront que vous êtes très aimable pour mettre l'effort et fournir la réponse :)) – Enggr

0

Quel est le code que vous avez actuellement (essayé)? À quoi ressemble le code d'entrée? À quoi devrait ressembler le code ?

Il va être difficile de répondre si vous ne fournissez pas certains détails. ;)

+0

Salut, j'ai ajouté les données XML d'entrée. Le code de sortie fonctionne le xsl: for-each ./*[count(child::*) = 0] et affiche le nom de colonne correct dans le résultat, mais je ne sais pas comment obtenir les colonnes suivantes dans le résultat. S'il vous plaît, donnez-moi une solution si vous avez.Merci d'avance à tous – Enggr