XSLT не принимается при выборе теста - PullRequest
2 голосов
/ 17 июля 2011

Я работал над чем-то для своего босса, веб-сайта, который отображает веб-сервисы системы продажи билетов. Веб-сервис выкладывает XML-файл на основе запроса. Моя проблема в том, что когда я пытаюсь установить условия для вывода, я либо получаю сообщение об ошибке, либо он пропускает весь путь до записи «иначе», когда массив, содержащий записи XML для каждого тикета, явно совпадает с тем, что у меня есть в моем тесте. Я новичок в XSLT, и у меня есть только то, что я изучил. Может кто-нибудь посмотреть на то, что у меня есть, и объяснить, почему это не работает? Я знаю, что это как-то связано с тестовым выражением.

XML (вывод в массиве, без оригинального XML-файла)

    Array
(
    [RowCount] => 3
    [HasError] => false
    [ErrorMessage] => Array
        (
        )

    [StackTrace] => Array
        (
        )

    [IncidentList] => Array
        (
            [Incident] => Array
                (
                    [0] => Array
                        (
                            [GroupName] => EXTERNAL_SUPPORT
                            [IncidentNumber] => 229178
                            [OpenDateAndTime] => 2011-05-09T10:42:33
                            [State] => O
                            [StatusID] => EMAIL WIP
                            [SubjectID] => MAGIC
                            [UrgencyID] => NORMAL
                        )

                    [1] => Array
                        (
                            [GroupName] => CISS SYSTEMS
                            [IncidentNumber] => 203863
                            [OpenDateAndTime] => 2010-05-25T09:16:55
                            [State] => C
                            [StatusID] => CLOSED
                            [SubjectID] => ULID EXPIRATION
                            [UrgencyID] => NORMAL
                        )

                    [2] => Array
                        (
                            [GroupName] => HELP DESK 1ST LEVEL
                            [IncidentNumber] => 186909
                            [OpenDateAndTime] => 2009-09-11T09:58:44
                            [State] => C
                            [StatusID] => CLOSED
                            [SubjectID] => QUESTION
                            [UrgencyID] => NORMAL
                        )

                )

        )

)

Я использую этот фрагмент XSLT для отображения таблицы, основанной на состоянии «O», «C» или иным образом, для отображения сообщения об отсутствии билетов для отображения.

<xsl:template match="/">
    <table id="myTable" class="list">
        <tr>
            <td class="title">Incident</td>
            <td class="title">Category</td>
            <td class="title">State</td>
            <td class="title">Status</td>
            <td class="title">Date</td>
        </tr>
        <xsl:choose>
            <xsl:when test="State = 'O'">
                <xsl:for-each select="Results/IncidentList/Incident">
                    <tr>
                        <td>#<xsl:value-of select="IncidentNumber"/></td>
                        <td><xsl:value-of select="SubjectID"/></td>
                        <td>OPEN</td>
                        <td><xsl:value-of select="StatusID"/></td>
                        <td>
                            <xsl:call-template name="formatDate">
                                <xsl:with-param name="dateTime" select="OpenDateAndTime" />
                            </xsl:call-template>
                        </td>
                    </tr>
                </xsl:for-each>
            </xsl:when>
            <xsl:when test="State = 'C'">
                <xsl:for-each select="Results/IncidentList/Incident">
                    <tr>
                        <td class="closed">#<xsl:value-of select="IncidentNumber"/></td>
                        <td class="closed"><xsl:value-of select="SubjectID"/></td>
                        <td class="closed">CLOSED</td>
                        <td class="closed"></td>
                        <td class="closed">
                            <xsl:call-template name="formatDate">
                                <xsl:with-param name="dateTime" select="OpenDateAndTime" />
                            </xsl:call-template>
                        </td>
                    </tr>
                </xsl:for-each>
            </xsl:when>
            <xsl:otherwise>
                <tr>
                    <td colspan="5">There are no incidents to display</td>
                </tr>
            </xsl:otherwise>
        </xsl:choose>
    </table>
</xsl:template>

</xsl:stylesheet>

Я перепробовал каждую итерацию тестового выражения, и я либо получаю ошибки, либо оно переходит непосредственно к другому. Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 17 июля 2011

Вы, вероятно, имели в виду это вместо 'xsl: when':

<xsl:for-each select="Results/IncidentList/Incident[State = 'O']"> 

и

<xsl:for-each select="Results/IncidentList/Incident[State = 'C']">

и т. Д.Контекст вашего условия «когда» в вашем примере - это не инцидент, а корень XML-документа.Таким образом, вы также можете предпочесть:

<xsl:for-each select="Results/IncidentList/Incident[State]">
   <xsl:choose>
      <xsl:when test="State = 'O'">..</xsl:when>
      <xsl:when test="State = 'C'">..</xsl:when>
      <Xsl:otherwise>..</xsl:otherwise>
   </xsl:choose>
</xsl:for-each>

Другая альтернатива - использование шаблонов:

<xsl:template match="/">
   ..
   <xsl:apply-templates select="Results/IncidentList/Incident[State]" />
   ..
</xsl:template>

<xsl:template match="Results/IncidentList/Incident[State = 'O']">..</xsl:template>
<xsl:template match="Results/IncidentList/Incident[State = 'C']">..</xsl:template>
..
0 голосов
/ 17 июля 2011
  • Ваш тест на значение State должен находиться внутри xsl:for-each, где контекст равен Incident, и относительный путь к State будет совпадать.

  • Более "сухой" подход заключается в перемещении xsl:choose внутри <td>, где вы применяете другое значение для State и избегаете повторения одной и той же логики столбцов для всех остальных.

  • Не хотите ли создать строку с сообщением «Нет отображаемых инцидентов», когда не было элементов Results/IncidentsList/Incident? В вашей текущей реализации (и в других ответы опубликованы), вы получите это сообщение только в том случае, если есть Results/IncidentList/Incident и значение State не равно ни "O", ни "C". Если бы их не было, вы бы не создали этот ряд.

Ниже приведена реализация, которая обращается к элементам, описанным выше:

  <xsl:template match="/">
        <table id="myTable" class="list">
            <tr>
                <td class="title">Incident</td>
                <td class="title">Category</td>
                <td class="title">State</td>
                <td class="title">Status</td>
                <td class="title">Date</td>
            </tr>
            <xsl:choose>
                <xsl:when test="Results/IncidentList/Incident">
                    <xsl:for-each select="Results/IncidentList/Incident">
                         <tr>
                             <td>#<xsl:value-of select="IncidentNumber"/></td>
                             <td><xsl:value-of select="SubjectID"/></td>
                             <td>
                                 <xsl:choose>
                                    <xsl:when test="State = 'O'">  
                                        <xsl:text>OPEN</xsl:text>
                                    </xsl:when>
                                     <xsl:when test="State = 'C'">
                                         <xsl:text>CLOSED</xsl:text>
                                     </xsl:when>
                                  </xsl:choose>
                             </td>
                             <td><xsl:value-of select="StatusID"/></td>
                             <td>
                                 <xsl:call-template name="formatDate">
                                     <xsl:with-param name="dateTime" select="OpenDateAndTime" />
                                 </xsl:call-template>
                             </td>
                         </tr>
                    </xsl:for-each>
                </xsl:when>
                <xsl:otherwise>
                  <tr>
                    <td colspan="5">There are no incidents to display</td>
                 </tr>
                </xsl:otherwise>
            </xsl:choose>
        </table>
    </xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...