0

I have an XML input with this structure:

<address>
    <ip>192.168.7.5</ip>
    <netmask>16</netmask>
    <wildcard-mask>0.0.0.255</wildcard-mask>
    <enable-wildcard-mask>false</enable-wildcard-mask>
</address>

I want to create a XSLT transformation that takes this input and uses either the 'wildcard-mask' value if 'enable-wildcard-mask' is true, or the 'netmask' value if 'enable-wildcard-mask' is false. However, the netmask must be converted from this format "24" to "255.255.255.0" and the wildcard mask must be converted to a netmask (binary negated).

So the output of this XSLT should be something like:

<netmask>255.255.255.0</netmask>

if 'enable-wildcard-mask' is true, and

<netmask>255.255.0.0</netmask>

if 'enable-wildcard-mask' is false.

This is the skeleton XSLT code for testing:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="address">
    <xsl:choose>
        <xsl:when test="wildcard-mask and (enable-wildcard-mask/text()='true')">
            <netmask type="string"><xsl:value-of select="wildcard-mask"/></netmask>
        </xsl:when>
        <xsl:when test="netmask">
            <netmask type="string"><xsl:value-of select="netmask"/></netmask>
        </xsl:when>
        <xsl:otherwise>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

How do I do the necessary bit-wise transformations in XSLT?

  • 1
    Here is already a question about bitwise logic: https://stackoverflow.com/questions/1106044/xslt-bitwise-logic – till Aug 21 '18 at 16:08
  • More recently, the EXPath Binary module has become available, providing a library of functions for manipulating binary data. It is available in products that are being actively developed such as Saxon, but not of course in older XSLT 1.0 processors. – Michael Kay Aug 21 '18 at 18:33

1 Answers1

0

In the end I implemented the transformations using look-up tables, since there are only 32 entries for each.

Therefore the first look-up table converts a wildcard mask to a netmask, and the 2nd one converts a netmask in this form "/24" to this form 255.255.255.0.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="address">
    <xsl:choose>
        <!-- These 2 look-up tables convert a wildcard to a netmask, and a netmask in this form '/24' to '255.255.255.0', respectively -->
        <xsl:when test="wildcard-mask and (enable-wildcard-mask/text()='true')">
            <xsl:choose>
                <xsl:when test="(wildcard-mask/text()='255.255.255.255')"><netmask type="string">0.0.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='127.255.255.255')"><netmask type="string">128.0.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='63.255.255.255')"><netmask type="string">192.0.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='31.255.255.255')"><netmask type="string">224.0.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='15.255.255.255')"><netmask type="string">240.0.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='7.255.255.255')"><netmask type="string">248.0.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='3.255.255.255')"><netmask type="string">252.0.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='1.255.255.255')"><netmask type="string">254.0.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.255.255.255')"><netmask type="string">255.0.0.0</netmask></xsl:when>

                <xsl:when test="(wildcard-mask/text()='0.255.255.255')"><netmask type="string">255.0.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.127.255.255')"><netmask type="string">255.128.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.63.255.255')"><netmask type="string">255.192.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.31.255.255')"><netmask type="string">255.224.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.15.255.255')"><netmask type="string">255.240.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.7.255.255')"><netmask type="string">255.248.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.3.255.255')"><netmask type="string">255.252.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.1.255.255')"><netmask type="string">255.254.0.0</netmask></xsl:when>

                <xsl:when test="(wildcard-mask/text()='0.0.255.255')"><netmask type="string">255.255.0.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.127.255')"><netmask type="string">255.255.128.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.63.255')"><netmask type="string">255.255.192.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.31.255')"><netmask type="string">255.255.224.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.15.255')"><netmask type="string">255.255.240.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.7.255')"><netmask type="string">255.255.248.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.3.255')"><netmask type="string">255.255.252.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.1.255')"><netmask type="string">255.255.254.0</netmask></xsl:when>

                <xsl:when test="(wildcard-mask/text()='0.0.0.255')"><netmask type="string">255.255.255.0</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.0.127')"><netmask type="string">255.255.255.128</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.0.63')"><netmask type="string">255.255.255.192</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.0.31')"><netmask type="string">255.255.255.224</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.0.15')"><netmask type="string">255.255.255.240</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.0.7')"><netmask type="string">255.255.255.248</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.0.3')"><netmask type="string">255.255.255.252</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.0.1')"><netmask type="string">255.255.255.254</netmask></xsl:when>
                <xsl:when test="(wildcard-mask/text()='0.0.0.0')"><netmask type="string">255.255.255.255</netmask></xsl:when>
                <xsl:otherwise></xsl:otherwise>
            </xsl:choose>
        </xsl:when>
        <xsl:when test="netmask">
            <xsl:choose>
                <xsl:when test="(netmask/text()='0')"><netmask type="string">0.0.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='1')"><netmask type="string">128.0.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='2')"><netmask type="string">192.0.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='3')"><netmask type="string">224.0.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='4')"><netmask type="string">240.0.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='5')"><netmask type="string">248.0.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='6')"><netmask type="string">252.0.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='7')"><netmask type="string">254.0.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='8')"><netmask type="string">255.0.0.0</netmask></xsl:when>

                <xsl:when test="(netmask/text()='9')"><netmask type="string">255.128.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='10')"><netmask type="string">255.192.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='11')"><netmask type="string">255.224.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='12')"><netmask type="string">255.240.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='13')"><netmask type="string">255.248.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='14')"><netmask type="string">255.252.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='15')"><netmask type="string">255.254.0.0</netmask></xsl:when>

                <xsl:when test="(netmask/text()='16')"><netmask type="string">255.255.0.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='17')"><netmask type="string">255.255.128.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='18')"><netmask type="string">255.255.192.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='19')"><netmask type="string">255.255.224.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='20')"><netmask type="string">255.255.240.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='21')"><netmask type="string">255.255.248.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='22')"><netmask type="string">255.255.252.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='23')"><netmask type="string">255.255.254.0</netmask></xsl:when>

                <xsl:when test="(netmask/text()='24')"><netmask type="string">255.255.255.0</netmask></xsl:when>
                <xsl:when test="(netmask/text()='25')"><netmask type="string">255.255.255.128</netmask></xsl:when>
                <xsl:when test="(netmask/text()='26')"><netmask type="string">255.255.255.192</netmask></xsl:when>
                <xsl:when test="(netmask/text()='27')"><netmask type="string">255.255.255.224</netmask></xsl:when>
                <xsl:when test="(netmask/text()='28')"><netmask type="string">255.255.255.240</netmask></xsl:when>
                <xsl:when test="(netmask/text()='29')"><netmask type="string">255.255.255.248</netmask></xsl:when>
                <xsl:when test="(netmask/text()='30')"><netmask type="string">255.255.255.252</netmask></xsl:when>
                <xsl:when test="(netmask/text()='31')"><netmask type="string">255.255.255.254</netmask></xsl:when>
                <xsl:when test="(netmask/text()='32')"><netmask type="string">255.255.255.255</netmask></xsl:when>
                <xsl:otherwise></xsl:otherwise>
            </xsl:choose>
        </xsl:when>
        <xsl:otherwise>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>