我有以下xsl模板循环(递归),它调用VBScript函数,该函数接受一个表示物理硬盘驱动器号的参数并检索驱动器信息:
<xsl:template name="for.loop.Drives">
<xsl:param name="i" select ="0" />
<xsl:param name="count" />
<!--begin_: Line_by_Line_Output -->
<xsl:if test="$i <= $count">
<xsl:value-of select="nunit2report2:GetDiskDrives($i)"/>
</xsl:if>
<!--begin_: RepeatTheLoopUntilFinished-->
<xsl:if test="$i <= $count">
<xsl:call-template name="for.loop.Drives">
<xsl:with-param name="i">
<xsl:value-of select="$i + 1"/>
</xsl:with-param>
<xsl:with-param name="count">
<xsl:value-of select="$count"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
VBScript函数(我验证了它的工作原理):
Function GetDiskDrives(drivenumber)
strComputer = "."
objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
colItems = objWMIService.ExecQuery("Select * from Win32_DiskDrive")
'For Each objItem in colItems
DiskDriveInfo = DiskDriveInfo & "Name: " & colItems.ItemIndex(drivenumber).Name & _
" -- Model: " & colItems.ItemIndex(drivenumber).Model & _
" -- Status: " & colItems.ItemIndex(drivenumber).Status & _
" -- Size: " & Int(colItems.ItemIndex(drivenumber).Size /(1073741824)) & " GB" & _
" -- Number of Partitions: " & colItems.ItemIndex(drivenumber).Partitions
'Next
GetDiskDrives = DiskDriveInfo
End Function
返回的错误是类型不匹配。它与传入函数的$ i有关:
<xsl:if test="$i <= $count">
<xsl:value-of select="nunit2report2:GetDiskDrives($i)"/>
</xsl:if>
当我这样做时,它有效,但我明确地传入1。
<xsl:if test="$i <= $count">
<xsl:value-of select="nunit2report2:GetDiskDrives(1)"/>
</xsl:if>
我尝试使用
将传入的$ i转换为VBScript中的整数drivenum = CInt(drivenumber)
但上面的演员表会返回以下错误:
System.InvalidCastException: Conversion from type 'XPathDocumentNavigator' to type 'Integer' is not valid.
任何人都知道我怎么能接听这个电话吗?我正在使用xslt 1.0
答案 0 :(得分:1)
您是否尝试过:
<xsl:value-of select="nunit2report2:GetDiskDrives(number($i))"/>
答案 1 :(得分:1)
除了Dimitre建议的内容,如果你改变了
<xsl:if test="$i <= $count">
<xsl:call-template name="for.loop.Drives">
<xsl:with-param name="i">
<xsl:value-of select="$i + 1"/>
</xsl:with-param>
<xsl:with-param name="count">
<xsl:value-of select="$count"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
到
<xsl:if test="$i <= $count">
<xsl:call-template name="for.loop.Drives">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="count" select="$count"/>
</xsl:call-template>
</xsl:if>
问题可能会消失,或者至少您的脚本函数会收到一个双数,如果WMI API需要,脚本可以轻松转换为整数。
您当前的代码不仅写入时间较长,而且不必要地传递结果树片段,您可以在其中传递数字值。