2010-07-26 1 views
0

J'ai le fichier source XML présent SVG comme ceci:comment transformer avec ce document source et cible?

<svg> 
<g id='a001' class='pools'> 
    <g id='b001' class='pool' name='Proc111'> 
     <g id='c001' class='lane' name='User111' PoolID='b001'> 
      <g id='d001' class='startevent' name='startevent111' LaneID='c001'></g> 
     </g> 
     <g id='c002' class='lane' name='User222' PoolID='b001'> 
      <g id='d002' class='gateway' name='gateway111' LaneID='c002'></g> 
     </g> 
    </g> 
    <g id='b002' class='pool' name='Proc222'> 
     <g id='c003' class='lane' name=' customer ' PoolID=' b002'> 
      <g id='d003' class='endevent' name='endevent111' LaneID='c003'> </g> 
     </g> 
    </g> 
</g> 
<g id='a002' class='messageflows'/> 

</svg> 

je veux Tranform à la cible XML comme document suivant:

<process id='a001' name='proc111'> 
    <laneset> 
    <lane name='User111'/> 
    <lane name='User222'/> 
    </laneset> 
    <startevent id='d001' name='startevent111'/> 
    <gateway id='d002' name='gateway111'/> 
</process> 

    <process id='a002' name='proc222'> 
    <laneset> 
    <lane name='customer'/> 
    </laneset> 
    <endevent id='d003' name='endevent111'/> 
</process> 

J'avais essayé avec une certaine transformation, mais il était infructueuse .. .Mon solution est de créer le modèle principal; et dans le modèle principal (modèle de processus), j'appelle les autres modèles qui sont starteventtemplate, endeventtemplate, modèle de passerelle, etc. Cependant, dans le document cible, j'obtiens tous les childrent qui sont présents pour chaque élément parent ('process ').

Parce que le vrai fichier est plus grand que cet exemple avec beaucoup d'éléments ... Donc, j'ai réalisé le problème principal à appliquer pour les éléments restants.

Répondre

0

Utilisation de la feuille de style suivante vous pouvez générer la sortie désirée:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="g[@class='pool']" > 
    <process> 
     <laneset> 
     <xsl:apply-templates mode="laneset" /> 
     </laneset> 
     <xsl:apply-templates mode="startevent" /> 
     <xsl:apply-templates mode="gateway" /> 
    </process> 
    </xsl:template> 

    <xsl:template match="g[@class='lane']" mode="laneset"> 
    <lane name="{@name}"/> 
    </xsl:template> 

    <xsl:template match="g[@class='startevent']" mode="startevent"> 
    <startevent id="{@id}" name="{@name}"/> 
    </xsl:template> 

    <xsl:template match="g[@class='gateway']" mode="gateway"> 
    <gateway id="{@id}" name="{@name}"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

merci! J'ai travaillé! Mais comment inverser la transformation. Je veux dire du document 'processus' au svg. Merci encore! – user402802

+0

@ user402802: Cela ne fonctionne pas. –

0

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="g[@class='pools']"> 
     <processes> 
      <xsl:apply-templates /> 
     </processes> 
    </xsl:template> 
    <xsl:template match="g[@class='pool']" priority="1"> 
     <process id="{@id}" name="{@name}"> 
      <laneset> 
       <xsl:apply-templates/> 
      </laneset> 
      <xsl:apply-templates select="*/*"/> 
     </process> 
    </xsl:template> 
    <xsl:template match="g/g"> 
     <xsl:element name="{@class}"> 
      <xsl:copy-of select="@id[../@class != 'lane']|@name"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Sortie:

<processes> 
    <process id="b001" name="Proc111"> 
     <laneset> 
      <lane name="User111" /> 
      <lane name="User222" /> 
     </laneset> 
     <startevent id="d001" name="startevent111" /> 
     <gateway id="d002" name="gateway111" /> 
    </process> 
    <process id="b002" name="Proc222"> 
     <laneset> 
      <lane name=" customer " /> 
     </laneset> 
     <endevent id="d003" name="endevent111" /> 
    </process> 
</processes> 

EDIT: Code compactage.

Questions connexes