2015-04-14 1 views
1

Je veux générer un nouveau fichier xmi en utilisant xslt mais j'ai un problème avec la boucle xsl: for-each en lisant le nom des balises je pense parce qu'il fonctionne bien avec des balises xml simples mais lors de l'utilisation de la balise xmi (uml: package par exemple) je n'ai pas de résultat. Voici mon fichier xmlxsl: pour chaque boucle ne fonctionne pas avec les fichiers xmi

<?xml version="1.0" encoding='UTF-8'?> 
<XMI xmi.version='1.2' timestamp='Thu Mar 26 11:55:39 CET 2015' xmlns:UML='omg.org/UML/2.0' > 
<UML:Namespace.ownedElement> 
<UML:Package xmi.id='_9_0_bc102e5_1427365805826_580042_22' name='migration'> 
</UML:Package> 
<UML:Package xmi.id='_9_0_bc102e5_1427365805826_580042_22' name='migration'> 
<UML:Class xmi.id='_9_0_bc102e5_1427367042666_255023_151' name='Employee'> 
</UML:Class> 
</UML:Package> 
</UML:Namespace.ownedElement> 
</XMI> 

et mon fichier xsl:

<?xml version="1.0" encoding='UTF-8'?> 
<xsl:stylesheet xmlns:UML="href://org.omg/UML/1.4" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xmi="http://www.omg.org/XMI" version="1.0"> 
<xsl:output indent="yes" method="xml"/> 

<xsl:template match="XMI"> 
<XMI> 
    <xsl:attribute name="xmi.version">2.1</xsl:attribute> 
    <xsl:attribute name="timestamp"> 
        <xsl:value-of select='XMI/@timestamp'/> 
        </xsl:attribute> 
<xsl:template match="UML:Namespace.ownedElement"> 
<xsl:for-each select="UML:Package"> 
<packagedElement> 
      <xsl:attribute name="xmi:type">uml:package</xsl:attribute> 
      <xsl:attribute name="xmi.id"> 
        <xsl:value-of select='../../@xmi.id'/> 
      </xsl:attribute> 
      <xsl:attribute name="name"> 
        <xsl:value-of select='@name'/> 
      </xsl:attribute> 


<packagedElement> 
      <xsl:attribute name="xmi:type">uml:Class</xsl:attribute> 
      <xsl:attribute name="xmi.id"> 
        <xsl:value-of select='@xmi.id'/> 
      </xsl:attribute> 
      <xsl:attribute name="name"> 
        <xsl:value-of select='@name'/> 
      </xsl:attribute> 
</packagedElement> 
</packagedElement> 
</xsl:for-each> 
</xsl:template> 
</XMI> 
</xsl:template> 
</xsl:stylesheet> 

Ceci est le résultat que je reçois:

<?xml version="1.0" encoding="UTF-8"?> 
<XMI xmi.version="2.1" timestamp="" xmlns:UML="org.omg/UML/1.4" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" /> 

Répondre

1

Votre XSLT a un <xsl:template../> à l'intérieur d'un autre. Cela ne fonctionne pas. Et votre deuxième problème est que le xmlns: UML n'a pas deux espaces de noms différents dans votre XML et dans votre XSLT omg.org/UML/2.0 et href://org.omg/UML/1.4.

Corrigez cela, puis cela fonctionne. Voici mon XSLT:

<xsl:template match="XMI"> 
     <XMI> 
      <xsl:attribute name="xmi.version">2.1</xsl:attribute> 
      <xsl:attribute name="timestamp"> 
       <xsl:value-of select='XMI/@timestamp'/> 
      </xsl:attribute> 
      <xsl:for-each select="*/UML:Package"> 
       <packagedElement> 
        <xsl:attribute name="xmi:type">uml:package</xsl:attribute> 
        <xsl:attribute name="xmi.id"> 
         <xsl:value-of select='../../@xmi.id'/> 
        </xsl:attribute> 
        <xsl:attribute name="name"> 
         <xsl:value-of select='@name'/> 
        </xsl:attribute>      

        <packagedElement> 
         <xsl:attribute name="xmi:type">uml:Class</xsl:attribute> 
         <xsl:attribute name="xmi.id"> 
          <xsl:value-of select='@xmi.id'/> 
         </xsl:attribute> 
         <xsl:attribute name="name"> 
          <xsl:value-of select='@name'/> 
         </xsl:attribute> 
        </packagedElement> 
       </packagedElement> 
      </xsl:for-each> 
     </XMI> 
    </xsl:template> 

</xsl:stylesheet> 

Donner cette sortie:

<?xml version="1.0" encoding="UTF-8"?> 
<XMI xmlns:UML="omg.org/UML/2.0" 
    xmlns:xmi="...omg.org/XMI" 
    xmi.version="2.1" 
    timestamp=""> 
    <packagedElement xmi:type="uml:package" xmi.id="" name="migration"> 
     <packagedElement xmi:type="uml:Class" 
      xmi.id="_9_0_bc102e5_1427365805826_580042_22" 
      name="migration"/> 
    </packagedElement> 
    <packagedElement xmi:type="uml:package" xmi.id="" name="migration"> 
     <packagedElement xmi:type="uml:Class" 
      xmi.id="_9_0_bc102e5_1427365805826_580042_22" 
      name="migration"/> 
    </packagedElement> 
</XMI> 
+0

"Votre XSLT a un intérieur d'une autre" que voulez-vous dire par là? – Iheb

+0

Vous avez un '' dans votre premier ' FiveO

+0

Supprimez simplement le 'juste avant le pour-chaque. Voir mon code – FiveO