我有以下xml文件
<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语句来查看Drive节点中是否存在字段totalSpace。我尝试使用下面这样的东西,但这是不成功的。
<xsl:if test="@totalSpace = ''" >
感谢您的帮助。
答案 0 :(得分: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>
希望这会有所帮助
答案 1 :(得分: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 :(得分:0)
如果您要查找该级别的所有totalSpace
属性的总和,您可以使用类似
<xsl:value-of select="sum(/DriveLayout/VolumeGroups/VolumeGroup/@totalSpace)"/>