2009-07-20 3 views
0

У меня есть следующий XML-файлВопрос по XPATH для XSLT-файл И XSLT Если Заявление

<DriveLayout> 
<Drive driveVolume="/u" Group="sa" Owner="sa" totalSpace="4" /> 
<Drive driveVolume="/u" Group="sa" Owner="sa" totalSpace="16" /> 
<Drive driveVolume="/u" Group="sa" Owner="sa" totalSpace="510" /> 
<Drive driveVolume="/u" Group="sa" Owner="sa" /> 
<Drive driveVolume="/u" Group="sa" Owner="sa" totalSpace="15" /> 
<VolumeGroups> 
<VolumeGroup storage="1" /> 
<VolumeGroup totalSpace="32" /> 
<VolumeGroup totalSpace="16" /> 
</VolumeGroups> 
</DriveLayout> 

Я пытаюсь получить к нему доступ с помощью таблицы стилей XSLT, которая выглядит примерно так.

<td class="LabelText" Width="10%"> 
     <xsl:value-of select="/DriveLayout/VolumeGroups/@totalSpace" /> 
    </td> 

Это не похоже, кто-нибудь знает, что такое правильный XPATH?

Кроме того, я хочу использовать инструкцию xslt if, чтобы увидеть, существует ли поле totalSpace в узле Drive. Я попытался использовать что-то вроде этого ниже, но это не увенчалось успехом.

<xsl:if test="@totalSpace = ''" > 

Спасибо за любую помощь.

+0

Correct XPATH для чего? У вас есть два атрибута totalSpace, и вы остановились/VolumeGroup. –

ответ

1

Вам нужно написать полные пути чтобы он работал. Как еще процессор будет знать, к чему вы обращаетесь.

минимальные изменения от того, что вы в настоящее время было бы это:

<td class="LabelText" Width="10%"> 
    <xsl:value-of select="/DriveLayout/VolumeGroups/VolumeGroup/@totalSpace[1]" /> 
</td> <!-- you need to write full paths! -------^^^^^^^^^^^^ --> 

и это:

<td class="LabelText" Width="10%"> 
    <xsl:value-of select="/DriveLayout/VolumeGroups/VolumeGroup/@totalSpace[2]" /> 
</td> 

и это:

<xsl:if test="/DriveLayout/Drive/@totalSpace"> 
    <!-- ... --> 
</xsl:if> 

Существование узла может быть проверили просто, написав для него выражение XPath. Если существует не, результирующий набор узлов будет пустым, а пустые наборы узлов будут вычисляться как false.

2

Я думаю, вы просто пропустили один уровень на вашем XPath, и для существования атрибута вы могли бы вам пример ниже:

<xsl:template match="/DriveLayout/VolumeGroups/VolumeGroup"> 
    <xsl:choose> 
     <xsl:when test="not(@totalSpace)"> 
      There's nothing here 
     </xsl:when> 
     <xsl:otherwise> 
      <td> 
       <xsl:value-of select="@totalSpace" /> 
      </td> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

надеюсь, что это помогает

0

Если вы ищете сумма всех атрибутов totalSpace на этом уровне, вы можете использовать что-то вроде

<xsl:value-of select="sum(/DriveLayout/VolumeGroups/VolumeGroup/@totalSpace)"/> 
Смежные вопросы