所以我有两个 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/