Subject: [xsl] Cosmetic sorting From: Harry Liljeström <harry.liljestrom@xxxxxxxxxxxxx> Date: Fri, 29 Dec 2006 16:22:07 +0200 (EET) |
<policy-rules> <fw-rule-order> fwrule3 fwrule1 fwrule2 </fw-rule-order> <fw-rules> <rule name="fwrule1"> <direction>out</direction> <action>pass<action> <remote>192.168.129.31</remote> <local>192.168.129.67</local> </rule> <rule name="fwrule2"> <direction>in</direction> <action>drop<action> <remote>192.168.129.32</remote> <local>192.168.129.67</local> </rule> <rule name="fwrule3"> <direction>out</direction> <action>pass<action> <remote>192.168.129.33</remote> <local>192.168.129.67</local> </rule> </fw-rules> </policy-rules>
XML transformation in XSLT 1.0 <!-- Global variables --> <xsl:variable name="rule-order"> <xsl:value-of select="normalize-space(/policy-rules/fw-rule-order)"/> </xsl:variable>
<xsl:template match="/"> <policy> <xsl:apply-templates select="//fw-rules/rule"/> </policy> </xsl:template>
<xsl:template match="//fw-rules/rule"> <xsl:variable name="precedence"> <xsl:call-template name="determineprecedence"> <xsl:with-param name="string" select="$rule-order"/> <xsl:with-param name="value" select="@name"/> </xsl:call-template> </xsl:variable> <rule type="{action}" precedence="{$precedence}">}"> <xsl:choose> <xsl:when test="direction='in'"> <src> <xsl:apply-templates select="remote"/> </src> <dst> <xsl:apply-templates select="local"/> </dst> </xsl:when> <xsl:otherwise> <src> <xsl:apply-templates select="local"/> </src> <dst> <xsl:apply-templates select="remote"/> </dst> </xsl:otherwise> </xsl:choose> </rule> </xsl:template>
<xsl:template match="remote"> <xsl:value-of select="."/> </xsl:template>
<xsl:template match="local"> <xsl:value-of select="."/> </xsl:template>
<!-- Named templates --> <xsl:template name="determineprecedence"> <xsl:param name="string"/> <xsl:param name="value"/> <!-- Returns the precedence of the rule --> </xsl:template>
Output without sorting, after XSLT processor recursion: <policy> <rule type="pass" precedence="1"> <src>192.168.129.67</src> <dst>192.168.129.31</dst> </rule> <rule type="drop" precedence="2"> <src>192.168.129.32</src> <dst>192.168.129.67</dst> </rule> <rule type="pass" precedence="0"> <src>192.168.129.67</src> <dst>192.168.129.33</dst> </rule> </policy>
Desired output: <policy> <rule type="pass" precedence="0"> <src>192.168.129.67</src> <dst>192.168.129.33</dst> </rule> <rule type="pass" precedence="1"> <src>192.168.129.67</src> <dst>192.168.129.31</dst> </rule> <rule type="drop" precedence="2"> <src>192.168.129.32</src> <dst>192.168.129.67</dst> </rule> </policy>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Managing cross references, Wendell Piez | Thread | [xsl] Overlapping fo:flows, Jacqueline Radebaugh |
[xsl] Managing cross references whe, Trevor Nicholls | Date | [xsl] Processing inner elements, Guy |
Month |