Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    11

    [XSL] gestione ricorsiva elementi XML (era: xslt ricorsivo)

    Raga..io dovrei scrivere un file xsl in cui si trattino gli elementi xml in modo ricorsivo...cioè io ho alcuni elementi: flow, invoke e receive per esempio. Ognuno ha dei propri elementi caratteristici all'interno e anche attributi.Ma il flow può contenere al suo interno altri flow ,i quali possono contenere altri flow e invoke e receive.

    Avete esempi di come si possa fare? o conoscete testi nn troppo complessi che trattano tale argomento?

    p.s la trasformazione che effettuo avviene da xml a xml.

  2. #2
    Utente di HTML.it L'avatar di Polley
    Registrato dal
    Jan 2005
    Messaggi
    696
    dipende tutto in che cosa devi trasformare gli elementi, posta un'esempio !!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    11
    raga...alla fine quello che io ho realizzato è questo...ma va bene solo x lo specifico file che vado a prendere in considerazione. Vi allego il file della trasformazione:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="http://schemas.xmlsoap.org/ws/2003/03/business-process/" version="1.0">
    <xslutput method="xml" indent="yes" xmlns:xalan="http://xml.apache.org/xslt" xalan:indent-amount="4" encoding="UTF-8" />
    <xsl:template match="ns0rocess">
    <process>
    <xsl:attribute name="name">
    <xsl:value-of select="@name" />
    </xsl:attribute>
    <xsl:attribute name="suppressJoinFailure">
    <xsl:value-of select="@suppressJoinFailure" />
    </xsl:attribute>
    <xsl:apply-templates select="ns0:flow" />
    </process>
    </xsl:template>
    <xsl:template match="ns0:flow">
    <flow>
    <xsl:apply-templates select="ns0:links" />
    <xsl:apply-templates select="ns0:receive" />
    <xsl:apply-templates select="ns0:invoke" />
    <xsl:apply-templates select="ns0:reply" />
    </flow>
    </xsl:template>
    <xsl:template match="ns0:reply">
    <reply>
    <xsl:attribute name="joinCondition">
    <xsl:value-of select="@joinCondition" />
    </xsl:attribute>
    <xsl:apply-templates select="ns0:target" />
    </reply>
    </xsl:template>
    <xsl:template match="ns0:target">
    <target>
    <xsl:attribute name="linkName">
    <xsl:value-of select="@linkName" />
    </xsl:attribute>
    <xsl:value-of select="." />
    </target>
    </xsl:template>
    <xsl:template match="ns0:invoke">
    <invoke>
    <target>
    <xsl:attribute name="linkName">
    <xsl:value-of select="ns0:target/@linkName" />
    </xsl:attribute>
    <xsl:value-of select="ns0:target" />
    </target>
    <source>
    <xsl:attribute name="linkName">
    <xsl:value-of select="ns0:source/@linkName" />
    </xsl:attribute>
    <xsl:attribute name="transitionCondition">
    <xsl:value-of select="ns0:source/@transitionCondition" />
    </xsl:attribute>
    <xsl:value-of select="ns0:source" />
    </source>
    </invoke>
    </xsl:template>
    <xsl:template match="ns0:receive">
    <receive>
    <xsl:apply-templates select="ns0:source" />
    </receive>
    </xsl:template>
    <xsl:template match="ns0:source">
    <source>
    <xsl:attribute name="linkName">
    <xsl:value-of select="@linkName" />
    </xsl:attribute>
    <xsl:attribute name="transitionCondition">
    <xsl:value-of select="@transitionCondition" />
    </xsl:attribute>
    <xsl:value-of select="." />
    </source>
    </xsl:template>
    <xsl:template match="ns0:links">
    <links>
    <xsl:apply-templates select="ns0:link" />
    </links>
    </xsl:template>
    <xsl:template match="ns0:link">
    <link>
    <xsl:attribute name="name">
    <xsl:value-of select="@name" />
    </xsl:attribute>
    <xsl:value-of select="." />
    </link>
    </xsl:template>
    </xsl:stylesheet>



    e invece il testo del file xml originale è:


    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    BPEL Process Definition
    Edited using ActiveBPEL(tm) Designer Version 2.0.0 (http://www.active-endpoints.com)
    -->
    <process name="prova3" suppressJoinFailure="yes" targetNamespace="http://prova3" xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:ns1="urn:active-endpoints.resources.wsdl.2005-10.loan_approval" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <partnerLinks>
    <partnerLink myRole="loanService" name="loanPartnerLinkType" partnerLinkType="ns1:loanPartnerLinkType"/>
    <partnerLink name="riskAssessmentLinkType" partnerLinkType="ns1:riskAssessmentLinkType" partnerRole="assessor"/>
    <partnerLink name="loanApprovalLinkType" partnerLinkType="ns1:loanApprovalLinkType" partnerRole="approver"/>
    </partnerLinks>
    <variables>
    <variable messageType="ns1:creditInformationMessage" name="creditInformationMessage"/>
    <variable messageType="ns1:approvalMessage" name="approvalMessage"/>
    <variable messageType="ns1:riskAssessmentMessage" name="riskAssessmentMessage"/>
    </variables>
    <flow>
    <links>
    <link name="l1"/>
    <link name="l2"/>
    <link name="l4"/>
    <link name="l3"/>
    </links>
    <receive createInstance="yes" operation="request" partnerLink="loanPartnerLinkType" portType="ns1:loanServicePT" variable="creditInformationMessage">
    <source linkName="l1" transitionCondition="bpws:getVariableData('creditI nformationMessage', 'amount') &lt;10"/>
    <source linkName="l2" transitionCondition="bpws:getVariableData('creditI nformationMessage', 'amount') &gt;=10"/>
    </receive>

    <invoke inputVariable="creditInformationMessage" operation="approve" outputVariable="approvalMessage" partnerLink="loanApprovalLinkType" portType="ns1:loanApprovalPT">
    <target linkName="l2"/>
    <source linkName="l4" transitionCondition="bpws:getVariableData('approva lMessage', 'accept') ='true'"/>
    </invoke>
    <invoke inputVariable="creditInformationMessage" operation="approve" outputVariable="approvalMessage" partnerLink="loanApprovalLinkType" portType="ns1:loanApprovalPT">
    <target linkName="l1"/>
    <source linkName="l3" transitionCondition="bpws:getVariableData('approva lMessage', 'accept') ='true'"/>
    </invoke>
    <reply joinCondition="and" partnerLink="loanPartnerLinkType" portType="ns1:loanServicePT" variable="approvalMessage">
    <target linkName="l3"/>
    <target linkName="l4"/>
    </reply>
    </flow>
    </process>



    come vedete del flow mi interessa solo il nome e i link, di tutti gli altri elementi mi interessa solo il target e il source,ed eventualmente la joincondition.
    Però il file l'ho realizzato con un plugin specifico x eclipse chiamato tiger(tra l'altro trial solo per 15 giorni)...e nn conosco altri softare per realizzare xsl in modo grafico e soprattutto per farlo in modo ricorsivo.
    Nel senso che esistono costrutti come il flow che potrebbero contenere altri flow,e possono contenere o meno degli invoke o dei receive.Invece ciò che ho realizzato si rifà solo al caso in cui ho un flow con all'interno una receive, due invoke e una reply.

  4. #4
    ciao

    questo è un foglio di stile ricorsivo che non fa nulla... ricrea la stesso file xml.

    In mezzo alla ricorsione però puoi farci quello che vuoi ;-) secondo me riesci ad adattarlo

    codice:
    <xsl:stylesheet version = '1.0' 
    xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
    <xsl:output method="xml"/>
    	<xsl:template match="/">
    		<xsl:call-template name="ricorsione"></xsl:call-template>
    	</xsl:template>
    
    <!--
    questo template si chiama ricorsivamente 
    - crea un elemento
    - stampa tutti i suoi attributi
    - se ha figli si chiama automaticamente
    - se non ha figli stampa il suo valore 
    -->
    	<xsl:template name="ricorsione">
    			<xsl:choose>
    				<xsl:when test="count(child::*)>0">
    					<xsl:for-each select="child::*">
    								<xsl:element  name="{name()}" >
    								<xsl:for-each select="attribute::*">
    									<xsl:attribute name="{name()}" ><xsl:value-of select="."/></xsl:attribute>
    								</xsl:for-each>
    									<xsl:call-template name="ricorsione"></xsl:call-template>  	
    					     		</xsl:element>
    					</xsl:for-each>
    				</xsl:when>
    				<xsl:otherwise>
    					<xsl:value-of select="."/>
    				</xsl:otherwise>
    			</xsl:choose>
    	</xsl:template>    	
    </xsl:stylesheet>
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.