Цикл по вложенным узлам с XSLT без указания атрибута - PullRequest
0 голосов
/ 13 марта 2020

У меня возникли проблемы с преобразованием некоторых XML. У меня есть довольно общий шаблон c, и все идет выше определенного уровня. Когда я дохожу до первого экземпляра вложенных объектов, мой преобразователь не дает мне никакого вывода.

Вот как выглядит XML:

<?xml version="1.0" encoding="utf-8"?>
<Statistics>
  <IcServer name="Apsep00840">
    <ININ.Workgroup>
      <ININ.People.WorkgroupStats_Workgroup name="Campaign 1">
        <ININ.Workgroup_NumberAvailableForACDInteractions>11</ININ.Workgroup_NumberAvailableForACDInteractions>
        <ININ.Workgroup_LongestAvailable>00:09:21</ININ.Workgroup_LongestAvailable>
        <ININ.Workgroup_OnInboundACDInteractions>0</ININ.Workgroup_OnInboundACDInteractions>
        <ININ.Workgroup_OnInboundACW>0</ININ.Workgroup_OnInboundACW>
        <ININ.Workgroup_LongestInboundACDInteraction>N/A</ININ.Workgroup_LongestInboundACDInteraction>
        <ININ.Workgroup_InteractionsWaiting>42</ININ.Workgroup_InteractionsWaiting>
        <ININ.Workgroup_LongestWaitTime>00:00:42</ININ.Workgroup_LongestWaitTime>
        <ININ.Workgroup_LongestOnHoldTime>N/A</ININ.Workgroup_LongestOnHoldTime>
        <ININ.Workgroup_AgentsLoggedInAndActivated>79</ININ.Workgroup_AgentsLoggedInAndActivated>
        <ININ.Queue_Interval name="CurrentShift">
          <ININ.Workgroup_InteractionsEntered>9602</ININ.Workgroup_InteractionsEntered>
          <ININ.Workgroup_InteractionsAnswered>9578</ININ.Workgroup_InteractionsAnswered>
          <ININ.Workgroup_InteractionsAbandoned>25</ININ.Workgroup_InteractionsAbandoned>
          <ININ.Workgroup_AverageWaitTime>00:00:01</ININ.Workgroup_AverageWaitTime>
          <ININ.Workgroup_AverageHoldTime>00:00:01</ININ.Workgroup_AverageHoldTime>
          <ININ.Workgroup_AverageTalkTime>00:02:17</ININ.Workgroup_AverageTalkTime>
          <ININ.Workgroup_ServiceLevelTarget>N/A</ININ.Workgroup_ServiceLevelTarget>
          <ININ.Workgroup_AbandonedRateTarget>N/A</ININ.Workgroup_AbandonedRateTarget>
        </ININ.Queue_Interval>
      </ININ.People.WorkgroupStats_Workgroup>
      <ININ.People.WorkgroupStats_Workgroup name="Campaign 2">
        <ININ.Workgroup_NumberAvailableForACDInteractions>11</ININ.Workgroup_NumberAvailableForACDInteractions>
        <ININ.Workgroup_LongestAvailable>00:09:21</ININ.Workgroup_LongestAvailable>
        <ININ.Workgroup_OnInboundACDInteractions>0</ININ.Workgroup_OnInboundACDInteractions>
        <ININ.Workgroup_OnInboundACW>0</ININ.Workgroup_OnInboundACW>
        <ININ.Workgroup_LongestInboundACDInteraction>N/A</ININ.Workgroup_LongestInboundACDInteraction>
        <ININ.Workgroup_InteractionsWaiting>0</ININ.Workgroup_InteractionsWaiting>
        <ININ.Workgroup_LongestWaitTime>N/A</ININ.Workgroup_LongestWaitTime>
        <ININ.Workgroup_LongestOnHoldTime>N/A</ININ.Workgroup_LongestOnHoldTime>
        <ININ.Workgroup_AgentsLoggedInAndActivated>79</ININ.Workgroup_AgentsLoggedInAndActivated>
        <ININ.Queue_Interval name="CurrentShift">
          <ININ.Workgroup_InteractionsEntered>5171</ININ.Workgroup_InteractionsEntered>
          <ININ.Workgroup_InteractionsAnswered>5161</ININ.Workgroup_InteractionsAnswered>
          <ININ.Workgroup_InteractionsAbandoned>10</ININ.Workgroup_InteractionsAbandoned>
          <ININ.Workgroup_AverageWaitTime>00:00:01</ININ.Workgroup_AverageWaitTime>
          <ININ.Workgroup_AverageHoldTime>00:00:01</ININ.Workgroup_AverageHoldTime>
          <ININ.Workgroup_AverageTalkTime>00:02:28</ININ.Workgroup_AverageTalkTime>
          <ININ.Workgroup_ServiceLevelTarget>N/A</ININ.Workgroup_ServiceLevelTarget>
          <ININ.Workgroup_AbandonedRateTarget>N/A</ININ.Workgroup_AbandonedRateTarget>
        </ININ.Queue_Interval>

Я в основном пытаюсь просто загрузить эти результаты в простую загрузочную таблицу. Мой XSL для этой таблицы выглядит так:


<table class="table table-hover table-dark table-striped">
<!-- Colspan for separating header --> 
    <col>
    <colgroup span="2"></colgroup>
    <colgroup span="2"></colgroup>
    </col>
    <thead>
        <tr>
            <th rowspan="2" style="text-align: left">Workgroup</th>
            <th style="text-align: center" class="border" colspan="9">Workgroup Stats</th>
            <th style="text-align: center" class="border" colspan="9">Queue Stats</th>
        </tr>
        <span>
            <th class="border-left" scope="col">Available for ACD Interactions</th>
            <th scope="col">Longest Available</th>
            <th scope="col">On Inbound ACD Interactions</th>
            <th scope="col">On Inbound ACW</th>
            <th scope="col">Longest Inbound ACD Interaction</th>
            <th scope="col">Interactions Waiting</th>
            <th scope="col">Longest Interaction Waiting</th>
            <th scope="col">Longest Hold Time</th>
            <th class="border-right" scope="col">Logged on and Activated</th>
            <th scope="col">Intrs Received </th>
            <th scope="col">Intrs Answered</th>
            <th scope="col">Intrs Abandoned</th>
            <th scope="col">Avg Wait</th>
            <th scope="col">Avg Hold</th>
            <th scope="col">Avg Talk</th>
            <th scope="col">Svc Lvl Tgt</th>
            <th class="border-right" scope="col">Abandon Tgt</th>
        </span>
        <tr>
        </tr>
    </thead>
    <tbody class="border-bottom">
        <xsl:for-each select="IcServer/ININ.Workgroup/ININ.People.WorkgroupStats_Workgroup">   
            <tr class="border-bottom">
                <td style="text-align: left">
                    <xsl:value-of select="@name"/>
                </td>
                <td class="border-left">
                    <xsl:value-of select="ININ.Workgroup_NumberAvailableForACDInteractions"/>
                </td>
                <div style="text-align: right">
                <td>
                    <xsl:value-of select="ININ.Workgroup_LongestAvailable"/>
                </td>
                <td>
                    <xsl:value-of select="ININ.Workgroup_OnInboundACDInteractions"/>
                </td>
                <td>
                    <xsl:value-of select="ININ.Workgroup_OnInboundACW"/>
                </td>
                <td>
                    <xsl:value-of select="ININ.Workgroup_LongestInboundACDInteraction"/>
                </td>
                <td>
                    <xsl:value-of select="ININ.Workgroup_InteractionsWaiting"/>
                </td>
                <td>
                    <xsl:value-of select="ININ.Workgroup_LongestWaitTime"/>
                </td>
                <td>
                    <xsl:value-of select="ININ.Workgroup_LongestOnHoldTime"/>
                </td>
                <td class="border-right">
                    <xsl:value-of select="ININ.Workgroup_AgentsLoggedInAndActivated"/>
                </td>
                <td>
                    <xsl:value-of select="//ININ.Workgroup_InteractionsEntered"/>
                </td>
                <td>
                    <xsl:value-of select="//ININ.Workgroup_InteractionsAnswered"/>
                </td>
                <td>
                    <xsl:value-of select="//ININ.Workgroup_InteractionsAbandoned"/>
                </td>
                <td class="border-right">
                    <xsl:value-of select="//ININ.Workgroup_AverageWaitTime"/>
                </td>
                <td>
                    <xsl:value-of select="//ININ.Workgroup_AverageHoldTime"/>
                </td>
                <td>
                    <xsl:value-of select="//ININ.Workgroup_AverageTalkTime"/>
                </td>
                <td>
                    <xsl:value-of select="//ININ.Workgroup_ServiceLevelTarget"/>
                </td>
                <td class="border-right">
                    <xsl:value-of select="//ININ.Workgroup_AbandonedRateTarget"/>
                </td>
                </div>
            </tr>
        </xsl:for-each>

    </tbody>
</table>

Извините за плотные линии. В основном, что я испытываю здесь, так это все обычные узлы на уровне '' 'ININ.Workgroup' '', но когда я пытаюсь получить доступ к материалу на узле '' 'ININ.Queue_Interval' '', они приходят обратно неверно (N / A или 0, где должны быть значения). Я попытался вставить атрибут @ CurrentShift в XPATH, например, <xsl:value-of select="ININ.Queue_Interval/@Name=CurrentShift/ININ.Workgroup_InteractionsEntered"/>, но он все еще входит как все 0 и N / As.

В полном объеме XML, существует около 30 или более ININ.People.WorkgroupStats_Workgroup узлов, поэтому я пытаюсь сделать это в пределах одного большого l oop, который попадает как в контент на уровне рабочей группы, так и в Queue_Interval уровень, но я не уверен, что это лучший способ для go.

Я также пробовал какой-то сокращенный XPATH, то есть

<xsl:value-of select="./ININ.Workgroup_InteractionsWaiting" /> 

Но опять же я просто трудно сузить проблему. Спасибо за ваше понимание (и терпение)!

Вот преобразованные XML (HTML?) И неправильные значения:

enter image description here

Мне кажется, что это может быть просто зацикливание первого найденного значения, но не точно.

1 Ответ

1 голос
/ 13 марта 2020

Трудно проверить ваш код, потому что он неполный (и слишком длинный - см. { ссылка }).

Предполагая, что ваша инструкция:

<xsl:for-each select="IcServer/ININ.Workgroup/ININ.People.WorkgroupStats_Workgroup">

работает, правильное выражение для получения значения из раздела ININ.Queue_Interval будет выглядеть следующим образом:

<xsl:value-of select="ININ.Queue_Interval/ININ.Workgroup_InteractionsEntered"/>

Это предполагает, что в текущем ININ.People.WorkgroupStats_Workgroup существует только один такой раздел. Если их может быть больше, и вы хотите указать тот, который вам нужен, с помощью атрибута name, то используйте:

<xsl:value-of select="ININ.Queue_Interval[@name='CurrentShift']/ININ.Workgroup_InteractionsEntered"/>

Вот демонстрация, использующая минимальный пример, подобный тому, который вы должны иметь используется:
https://xsltfiddle.liberty-development.net/naZXVEH

Если вы получаете другой результат, значит, что-то не так с вашей цепочкой обработки.

...