|
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 |