有关XSLT文件和XSLT If语句的XPATH的问题

时间:2009-07-20 20:03:17

标签: xml xslt xpath

我有以下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 = ''" >

感谢您的帮助。

3 个答案:

答案 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)"/>