2009-07-20 7 views
0

Je le fichier XML suivantQuestion sur XPATH pour un fichier XSLT et XSLT Si Déclaration

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

Je suis en train d'accéder à l'aide d'une feuille de style xslt qui ressemble à quelque chose comme ça.

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

Cela ne semble pas être correct, est-ce que quelqu'un sait ce que serait le bon XPATH?

En outre, je veux utiliser une instruction xslt if pour voir si le champ totalSpace existe dans le nœud Drive. J'ai essayé d'utiliser quelque chose comme ça ci-dessous mais cela n'a pas réussi.

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

Merci pour toute aide.

+0

correcte XPATH pour quoi? Vous avez deux attributs totalSpace et vous avez désactivé/VolumeGroup. –

Répondre

1

Vous devez écrire le chemin complet pour le faire fonctionner. Sinon, comment le processeur pourrait-il savoir à quoi vous faites référence?

Les modifications minimales de ce que vous avez actuellement serait ceci:

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

et ceci:

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

et ceci:

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

L'existence d'un nœud peut être vérifié simplement en écrivant une expression XPath pour cela. Si n'existe pas, l'ensemble de nœuds résultant sera vide et les ensembles de nœuds vides seront faux.

2

Je pense que vous venez de manquer à un niveau sur votre XPath, et l'existence de l'attribut que vous pourriez-vous l'exemple ci-dessous:

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

this helps

0

Si vous cherchez la somme de tous les attributs totalSpace à ce niveau, vous pouvez utiliser quelque chose comme

<xsl:value-of select="sum(/DriveLayout/VolumeGroups/VolumeGroup/@totalSpace)"/>