Вопрос по XPATH для файла XSLT и оператора XSLT If - PullRequest
0 голосов
/ 21 июля 2009

У меня есть следующий 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, чтобы увидеть, существует ли поле totalSpace в узле Drive. Я попытался использовать что-то вроде этого ниже, но это было безуспешно.

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

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

Ответы [ 3 ]

2 голосов
/ 21 июля 2009

Я думаю, что вы только что пропустили один уровень в вашем 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 голос
/ 21 июля 2009

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

Минимальные изменения по сравнению с тем, что у вас сейчас есть, будут:

<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. Если не существует, результирующий набор узлов будет пустым, а пустые наборы узлов оцениваются как ложные.

0 голосов
/ 21 июля 2009

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

<xsl:value-of select="sum(/DriveLayout/VolumeGroups/VolumeGroup/@totalSpace)"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...