Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    3

    XSLT Problema con i Templates

    Sto scrivendo una applicazione in C# che crea e modifica file XML contenenti regole per un Firewall Linux e poi lancia una trasformazione XSLT con un foglio che creo io a parte. La struttura del file XML è la seguente (a spanne):

    <FIREWALL name="Firewall1">
    <ETH name="0">
    <TYPE name="Header">
    <RULE name="" ...../>
    <RULE name="" ...../>
    </TYPE>
    <TYPE name="Service">
    <RULE name="" ...../>
    <RULE name="" ...../>
    </TYPE>
    </ETH>
    <ETH name="lo">
    .....
    .....
    .....
    </ETH>
    </FIREWALL>

    In sostanza quello che voglio fare è applicare DIVERSI template alle RULES in base al loro tipo (TYPE) con una struttura del tipo xsl:choose se possibile. Per intenderci quello che sto facendo è tradurre una struttura XML in linguaggio IPTables per Linux e di conseguenza diversi tipi di regole (RULES) hanno diversi tipi di traduzione che implemento appunto con diversi template XSLT.
    Il problema è che non riesco a implementare questa cosa, sono alle prime armi con XSLT, so fare un template e in realtà ho già fatto i template per i vari tipi (TYPE) e presi singolarmente funzionano e traducono correttamente, il problema è che quando li metto tutti assieme e provo a fare questa struttura con choose non funziona più niente, non esistendo un debug non capisco cosa non quadra. Dalla disperazione ho provato a scrivere un XSLT BIANCO con un when (o if che sia) e non ci entra mai nel when o if, neppure se come condizione metto 1=1 -.-" La cosa assurda è che la struttura che vorrei io richiede neanche 10 righe di codice e non riesco a scriverle xD Qualcuno mi può aiutare?

    EDIT: L'istruzione che ho scritto io è la seguente:

    <xsl:template match="TYPE">
    <xsl:choose>
    <xsl:when test="name='Header'">
    CHIAMO IL TEMPLATE CORRISPONDENTE PER LE RULES AL SUO INTERNO (COME?)
    </xsl:when>
    </xsl:choose>
    </xsl:template>

    Che comunque nel when non ci entra mai, ho provato a scriverci dentro ciao e non appare >.<

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    3
    Ho fatto un XML e un XSLT veloce di prova:

    XML:

    codice:
    <?xml version="1.0" ?>
    <?xml-stylesheet type="text/xsl" href="test.xslt"?> 
    <fw name="ciao">
    	<eth name="0">
    		<type name="1">
    			<rule name="a"/>
    		</type>
    		<type name="2">
    			<rule name="b"/>
    		</type>
    	</eth>
    </fw>
    XSLT:

    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="text"/>
    	<xsl:template match="/">
    		    <xsl:apply-templates></xsl:apply-templates>
    	</xsl:template>
    	<xsl:template name="type" match="type">
    	<xsl:choose>
    		<xsl:when test="@name = 1">
    			<xsl:call-template name="rule1"></xsl:call-template>
    		</xsl:when>
    		<xsl:when test="@name = 2">
    			<xsl:call-template name="rule2"></xsl:call-template>
    		</xsl:when>
    	</xsl:choose>
    	</xsl:template>
    	<xsl:template name="rule1" match="rule">
    		IPTABLES <xsl:value-of select="@name"></xsl:value-of>
    	</xsl:template>
    	<xsl:template name="rule2" match="rule">
    		IPTABLES -t <xsl:value-of select="@name"></xsl:value-of>
    	</xsl:template>
    </xsl:stylesheet>
    La trasformazione che appare è la seguente:

    IPTABLES 1 IPTABLES -t 2

    Io invece vorrei che venisse fuori IPTABLES a IPTABLES -t b

    Come faccio?

  3. #3
    ciao devi usare nel secondo template ti trovi ancora a livello di type, quindi devi usare l'xpath per andare al livello sotto:

    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="text"/>
    	<xsl:template match="/">
    		    <xsl:apply-templates></xsl:apply-templates>
    	</xsl:template>
    	<xsl:template name="type" match="type">
    	<xsl:choose>
    		<xsl:when test="@name = 1">
    			<xsl:call-template name="rule1"></xsl:call-template>
    
    		</xsl:when>
    		<xsl:when test="@name = 2">
    			<xsl:call-template name="rule2"></xsl:call-template>
    		</xsl:when>
    	</xsl:choose>
    	</xsl:template>
    	<xsl:template name="rule1" match="rule">
    		IPTABLES <xsl:value-of select="./rule/@name"></xsl:value-of>
    
    	</xsl:template>
    	<xsl:template name="rule2" match="rule">
    		IPTABLES -t <xsl:value-of select="./rule/@name"></xsl:value-of>
    	</xsl:template>
    </xsl:stylesheet>
    Ciao
    "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.