Ошибка несоответствия типов при попытке вызова функции wmi из цикла xslt - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть следующий цикл шаблона 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. 1. 1012 *

<xsl:if test="$i &lt;= $count">
    <xsl:value-of select="nunit2report2:GetDiskDrives(1)"/>
</xsl:if>

Iпопытался преобразовать переданный в $ i в целое число в VBScript, используя

drivenum = CInt(drivenumber)

, но приведенное выше приведение возвращает следующую ошибку:

System.InvalidCastException: Conversion from type 'XPathDocumentNavigator' to type 'Integer' is not valid.

Кто-нибудь знает, как я могу получить этот вызов правильно?Я использую xslt 1.0

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

В дополнение к тому, что предложил Димитр, если вы измените

<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.

Ваш текущий код не только длиннее для записи, но и излишне передается вокруг фрагментов дерева результатов, где все, что вам нужно, это передавать числовые значения.

1 голос
/ 14 сентября 2011

Вы пробовали :

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