草庐IT

xml - XSLT - 减去 IP 地址范围以查找主机数

coder 2024-06-29 原文

所以我有两个 IP 地址,一个 endIP 和一个 startIP。必须根据 IP 地址范围计算主机数。

我测试了一个示例,起始 IP 地址为 192.168.2.188,有 88 个主机。所以我得到的结束地址是 192.168.3.19。但是,我的 xml 文件中没有 88 台主机的记录(因为它是自动生成的),我应该如何找到主机数?

所以我做了一个 <xsl:value-of select="endIP - startIP"/>认为它至少会给我剩下的。但是,在我解析它之后返回了一个“NaN”。算一下,因为它是多位小数。我对 XSL 不是很熟悉,所以这让我很头疼。

我完全不知道如何根据 IP 地址范围计算主机号。任何帮助将不胜感激。

最佳答案

实现此目的的一种方法是将 ip 代码转换为整数,然后进行减法。当然,这对子网中的主机数量做出了一些隐含的假设。

对于这个输入文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<HOSTS>
  <HOST ID="a" IP="192.168.2.188"/>
  <HOST ID="b" IP="192.168.3.19"/>
</HOSTS>

您可以使用以下 XSLT 文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet 
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

  <xsl:template name="ip_to_number">
    <xsl:param name="ip"/>
    <xsl:variable name="ip1" select="substring-before($ip, '.')"/>
    <xsl:variable name="ip2" select="substring-before(substring-after($ip, concat($ip1, '.')), '.')"/>
    <xsl:variable name="ip3" select="substring-before(substring-after($ip, concat($ip1, '.', $ip2, '.')), '.')"/>
    <xsl:variable name="ip4" select="substring-after($ip, concat($ip1, '.', $ip2, '.', $ip3, '.'))"/>
    <xsl:value-of select="(((number($ip1) * 256) + number($ip2)) * 256 + number($ip3)) * 256 + number($ip4)"/>
  </xsl:template>

  <xsl:template match="/HOSTS">

    <xsl:variable name="number_a">
      <xsl:call-template name="ip_to_number">
        <xsl:with-param name="ip"><xsl:value-of select="HOST[@ID='a']/@IP"/></xsl:with-param>
      </xsl:call-template>
    </xsl:variable>

    <xsl:variable name="number_b">
      <xsl:call-template name="ip_to_number">
        <xsl:with-param name="ip"><xsl:value-of select="HOST[@ID='b']/@IP"/></xsl:with-param>
      </xsl:call-template>
    </xsl:variable>

    <xsl:text>Number of hosts: </xsl:text><xsl:value-of select="$number_b - $number_a + 1"/>

  </xsl:template>
</xsl:stylesheet>

结果是:

Number of hosts: 88

您可以编写另一个帮助程序模板来计算两个 ip 号之间的差异。此外,您可能希望更改模板,使其直接从源文档中提取 IP 号码,而不是将它们作为参数传递。

关于xml - XSLT - 减去 IP 地址范围以查找主机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19483054/

有关xml - XSLT - 减去 IP 地址范围以查找主机数的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  3. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  4. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  5. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  6. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  7. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  8. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  9. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  10. Ruby 日期参数超出范围 - 2

    我正在尝试使用在我的代码中是动态的Time.local来安排时间。在每个月的第一天,我传递的值是Time.local(2009,9,-1,0)。在PHP中,这会将时间设置为上个月的最后一天。在ruby​​中,我只是得到“ArgumentError:参数超出范围”。是我用错了方法还是什么?谢谢。 最佳答案 您应该使用DateTime类而不是Time。(您可能需要先require'date'并安装activesupportgem。)它比Time更通用,并且可以用DateTime.civil(2009,9-1,-1,0)做你想做的事。为天

随机推荐