2011-06-29 5 views
1

Je trouve qu'il est assez difficile de trouver des informations sur la façon de mettre en page XSL lors de l'application d'un schéma avec une sortie xml.XSLT Débutant question

Actuellement, j'ai C# code à exécuter:

  static void Main(string[] args) 
      { 
     XslCompiledTransform myXslTransform; 
     myXslTransform = new XslCompiledTransform(); 
     myXslTransform.Load("testxls.xsl"); 
     myXslTransform.Transform("1BFC.xml", "testoutput.xml"); 
     //Console.ReadLine(); 
        } 

Et mon xls ressemble

 <?xml version="1.0" encoding="windows-1252"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes" method="xml" /> 
    <xsl:template match="/"> 
    <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="FileImport"> 
    <FileImport> 
    <xsl:apply-templates /> 
    </FileImport> 
    </xsl:template> 

    <xsl:template match="Global"> 
    <Global> 
    <xsl:apply-templates /> 
    </Global> 
    </xsl:template> 

    <xsl:template match="GlobalParam"> 
    <GlobalParam> 
    <xsl:attribute name="name"> 
     <xsl:value-of select="@name" /> 
    </xsl:attribute> 
    <xsl:value-of select="."/> 
    </GlobalParam> 
    <GlobalParam> 
    <xsl:attribute name="value"> 
     <xsl:value-of select="@value" /> 
    </xsl:attribute> 
    <xsl:value-of select="."/> 
    </GlobalParam> 
    </xsl:template> 

Ce qui fonctionne mais ne produit pas la sortie que je voudrais: la sortie ressemble à:

  <FileImport> 
      <Global> 
     <GlobalParam name="RollName"></GlobalParam><GlobalParam value="SA2 10:00:00:00"></GlobalParam> 
     <GlobalParam name="TapeOrg"></GlobalParam><GlobalParam value="10:00:00:00">     </GlobalParam> 
     <GlobalParam name="ReadStart"></GlobalParam><GlobalParam value="00:00:00:00"> </GlobalParam> 
     <GlobalParam name="ReadDuration"></GlobalParam><GlobalParam value="00:02:26:18"></GlobalParam> 

Ce que je voudrais tout est contenu dans la variable globale, donc je voudrais qu'il ressemble à:

 <Global> 
     <GlobalParam name="RollName" value="SA2" /> 
     <GlobalParam name="TapeOrg" value="10:00:00:00" /> 
     <GlobalParam name="ReadStart" value="00:00:00:00" /> 
     <GlobalParam name="ReadDuration" value="00:00:21:07" /> 
     </Global> 

ne peuvent tout simplement ne pas trouver d'informations sur l'explication xml 2 xml XSL. Je ne dois pas le contenir correctement .. Merci pour toute aide ou pointeurs.

+0

Pouvez-vous modifier la question et ajouter un fichier source XML exemple s'il vous plaît? Peut-être que le '1BFC.xml' que vous utilisez dans la source? – andyb

+0

Si vous voulez que les attributs soient inclus dans une seule instance de 'GlobalParam', pourquoi créez-vous deux instances distinctes de cet élément dans votre transformation? –

Répondre

1

Votre XSLT devrait ressembler à ceci:

<?xml version="1.0" encoding="windows-1252"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes" method="xml" /> 

    <xsl:template match="Global"> 
     <Global> 
      <xsl:apply-templates /> 
     </Global> 
    </xsl:template> 

    <xsl:template match="GlobalParam"> 
     <GlobalParam> 
      <xsl:attribute name="name"> 
       <xsl:value-of select="@name" /> 
      </xsl:attribute> 
      <xsl:attribute name="value"> 
       <xsl:value-of select="@value" /> 
      </xsl:attribute> 
     </GlobalParam> 
    </xsl:template> 
</xsl:stylesheet> 
0

Supprime les balises <GlobalParam> de l'attribut de valeur.

0

À première vue, on dirait qu'il ya quelques problèmes ici. Je crois que vous devez appliquer le modèle GlobalParam dans le modèle Global (en utilisant xsl: apply-templates). Dans le modèle GlobalParam, vous devez vous débarrasser de la section du milieu où vous fermez et rouvrez la balise GlobalParam afin d'avoir le nom et la valeur contenus dans un seul élément.

0

Je pense que vous voulez:

<xsl:template match="GlobalParam"> 
<xsl:copy> 
    <xsl:copy-of select="@name|@value"/> 
</xsl:copy> 
</xsl:template> 
2

Ou si vous préférez,

<xsl:template match="GlobalParam"> 
    <GlobalParam name="{@name}" value="{@value}"/> 
</xsl:template>