以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  通过xslt将子网掩码转换为IP形式  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=51562)


--  作者:自由风
--  发布时间:8/20/2007 11:57:00 AM

--  通过xslt将子网掩码转换为IP形式
将<pe_static_route>10.10.41.0/25</pe_static_route>
中的子网掩码25转换成IP形式,及:255.255.255.128;
也就是说25代表25个1,及:11111111.11111111.1111111.10000000转换成10进制就是:255.255.255.128;
目前的问题是25是一变量,请教各位高手这样子的转换template怎么写?


--  作者:Qr
--  发布时间:8/22/2007 12:33:00 PM

--  
用/n后的n值 div 8取整就知道有 i 组11111111,这就得到 i 个255和 4-i 组8位二进制数,有多少组有1和0的也就能计算出来了,全0的不用转换,只须转换有1和0的一组。二进制转十进制不用偶教你了吧。

现在没时间,只能给你个思路,有时间再写代码吧。


--  作者:Qr
--  发布时间:8/22/2007 6:50:00 PM

--  
代码中2进制转10进制本来是用递归的,但是想想要用两个模板嵌套就晕了,直接用<xsl:when>来实现这个功能了,长了很多,不喜欢就自己改递归吧。
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
 <xsl:apply-templates select="//pe_static_route"/>
</xsl:template>

<xsl:template match="pe_static_route">
 <xsl:value-of select="."/><br/>
 <xsl:variable name="len" select="substring-after(.,'/')"/>
 <xsl:variable name="n" select="floor($len div 8)"/>
 <xsl:variable name="i" select="$len - $n*8"/>

 <xsl:variable name="N1">
  <xsl:choose>
  <xsl:when test="$i>=1"><xsl:value-of select="2*2*2*2*2*2*2"/></xsl:when>
  <xsl:otherwise>0</xsl:otherwise>
  </xsl:choose>
 </xsl:variable>
 <xsl:variable name="N2">
  <xsl:choose>
  <xsl:when test="$i>=2"><xsl:value-of select="2*2*2*2*2*2"/></xsl:when>
  <xsl:otherwise>0</xsl:otherwise>
  </xsl:choose>
 </xsl:variable>
 <xsl:variable name="N3">
  <xsl:choose>
  <xsl:when test="$i>=3"><xsl:value-of select="2*2*2*2*2"/></xsl:when>
  <xsl:otherwise>0</xsl:otherwise>
  </xsl:choose>
 </xsl:variable>
 <xsl:variable name="N4">
  <xsl:choose>
  <xsl:when test="$i>=4"><xsl:value-of select="2*2*2*2"/></xsl:when>
  <xsl:otherwise>0</xsl:otherwise>
  </xsl:choose>
 </xsl:variable>
 <xsl:variable name="N5">
  <xsl:choose>
  <xsl:when test="$i>=5"><xsl:value-of select="2*2*2"/></xsl:when>
  <xsl:otherwise>0</xsl:otherwise>
  </xsl:choose>
 </xsl:variable>
 <xsl:variable name="N6">
  <xsl:choose>
  <xsl:when test="$i>=6"><xsl:value-of select="2*2"/></xsl:when>
  <xsl:otherwise>0</xsl:otherwise>
  </xsl:choose>
 </xsl:variable>
 <xsl:variable name="N7">
  <xsl:choose>
  <xsl:when test="$i>=7"><xsl:value-of select="2"/></xsl:when>
  <xsl:otherwise>0</xsl:otherwise>
  </xsl:choose>
 </xsl:variable>

 <xsl:variable name="N" select="$N1+$N2+$N3+$N4+$N5+$N6+$N7"/>

 <font color="red">
 <xsl:choose>
 <xsl:when test="$n=3">255.255.255.<xsl:value-of select="$N"/></xsl:when>
 <xsl:when test="$n=2">255.255.<xsl:value-of select="$N"/>.0</xsl:when>
 <xsl:when test="$n=1">255.<xsl:value-of select="$N"/>.0.0</xsl:when>
 </xsl:choose>
 </font>
 <br/><br/>

</xsl:template>

</xsl:stylesheet>


用递归主要是进行循环计数,相关的递归代码你可以上偶的BLOG看看。


--  作者:自由风
--  发布时间:9/17/2007 4:23:00 PM

--  
太感谢Qr大哥了
前几天着急用,我自己用最笨的办法弄了一个判断如下:
<?xml version="1.0" encoding="UTF-8"?>
<ip_mask>
 <xsl:variable name="mask">
  <xsl:value-of select="ip_mask"/>
 </xsl:variable>
 <xsl:variable name="mask0">
  <xsl:value-of select="number($mask)"/>
 </xsl:variable>
 <xsl:variable name="mask1">
  <xsl:value-of select="floor(($mask0)div(8))"/>
 </xsl:variable>
 <xsl:variable name="mask2">
  <xsl:value-of select="($mask0)mod(8)"/>
 </xsl:variable>
 <xsl:choose>
  <xsl:when test="$mask1=0">
   <xsl:choose>
    <xsl:when test="$mask2=0">0.0.0.0</xsl:when>
    <xsl:when test="$mask2=1">128.0.0.0</xsl:when>
    <xsl:when test="$mask2=2">192.0.0.0</xsl:when>
    <xsl:when test="$mask2=3">224.0.0.0</xsl:when>
    <xsl:when test="$mask2=4">240.0.0.0</xsl:when>
    <xsl:when test="$mask2=5">248.0.0.0</xsl:when>
    <xsl:when test="$mask2=6">252.0.0.0</xsl:when>
    <xsl:when test="$mask2=7">254.0.0.0</xsl:when>
   </xsl:choose>
  </xsl:when>
  <xsl:when test="$mask1=1">
   <xsl:choose>
    <xsl:when test="$mask2=0">255.0.0.0</xsl:when>
    <xsl:when test="$mask2=1">255.128.0.0</xsl:when>
    <xsl:when test="$mask2=2">255.192.0.0</xsl:when>
    <xsl:when test="$mask2=3">255.224.0.0</xsl:when>
    <xsl:when test="$mask2=4">255.240.0.0</xsl:when>
    <xsl:when test="$mask2=5">255.248.0.0</xsl:when>
    <xsl:when test="$mask2=6">255.252.0.0</xsl:when>
    <xsl:when test="$mask2=7">255.254.0.0</xsl:when>
   </xsl:choose>
  </xsl:when>
  <xsl:when test="$mask1=2">
   <xsl:choose>
    <xsl:when test="$mask2=0">255.255.0.0</xsl:when>
    <xsl:when test="$mask2=1">255.255.128.0</xsl:when>
    <xsl:when test="$mask2=2">255.255.192.0</xsl:when>
    <xsl:when test="$mask2=3">255.255.224.0</xsl:when>
    <xsl:when test="$mask2=4">255.255.240.0</xsl:when>
    <xsl:when test="$mask2=5">255.255.248.0</xsl:when>
    <xsl:when test="$mask2=6">255.255.252.0</xsl:when>
    <xsl:when test="$mask2=7">255.255.254.0</xsl:when>
   </xsl:choose>
  </xsl:when>
  <xsl:when test="$mask1=3">
   <xsl:choose>
    <xsl:when test="$mask2=0">255.255.255.0</xsl:when>
    <xsl:when test="$mask2=1">255.255.255.128</xsl:when>
    <xsl:when test="$mask2=2">255.255.255.192</xsl:when>
    <xsl:when test="$mask2=3">255.255.255.224</xsl:when>
    <xsl:when test="$mask2=4">255.255.255.240</xsl:when>
    <xsl:when test="$mask2=5">255.255.255.248</xsl:when>
    <xsl:when test="$mask2=6">255.255.255.252</xsl:when>
    <xsl:when test="$mask2=7">255.255.255.254</xsl:when>
   </xsl:choose>
  </xsl:when>
 </xsl:choose>
</ip_mask>

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms