一种方法是将 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 号,而不是将它们作为参数传递。