尝试从xslt循环内调用wmi函数时输入不匹配错误

时间:2011-09-13 23:35:25

标签: xslt xslt-1.0

我有以下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 &lt;= $count">
    <xsl:value-of select="nunit2report2:GetDiskDrives($i)"/>
</xsl:if>

<!--begin_: RepeatTheLoopUntilFinished-->
<xsl:if test="$i &lt;= $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 &lt;= $count">
    <xsl:value-of select="nunit2report2:GetDiskDrives($i)"/>
</xsl:if>

当我这样做时,它有效,但我明确地传入1。

<xsl:if test="$i &lt;= $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

2 个答案:

答案 0 :(得分:1)

您是否尝试过

<xsl:value-of select="nunit2report2:GetDiskDrives(number($i))"/>

答案 1 :(得分:1)

除了Dimitre建议的内容,如果你改变了

<xsl:if test="$i &lt;= $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 &lt;= $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需要,脚本可以轻松转换为整数。

您当前的代码不仅写入时间较长,而且不必要地传递结果树片段,您可以在其中传递数字值。