Повтор XForms - ошибка JavaScript - PullRequest
1 голос
/ 08 марта 2012

Я использую XForms для создания веб-приложения с XML-DB eXist-db в качестве бэкэнда. eXist преобразует код XForms в HTML и JavaScript.

Прежде всего, я получил два экземпляра:

<xf:instance xmlns="" id="results">
  <result>
    <ServiceDefinition>
      <InventoryLabel LastChange="2012-01-24">SVC380712435</InventoryLabel>
      <SystemName IPaddress="111.222.333.123">XXX</SystemName>
      <Service ServiceCategory="Internetservice">Web-Server</Service>
      <OSClass OperatingSystem="CentOS">UNIX</OSClass>
      <SystemType Manufacturer="VMware">VM</SystemType>
      <Backup/>
      <Location SystemContact="Max Power" AdminGroup="power">N22</Location>
    </ServiceDefinition>
    ....
  </result>
</xf:instance>

<xf:instance xmlns="" id="domain">
  <system name="XXX">
    <NIC MAC="00-50-56-ae-00-3c" 
         time="1329167846" missed="1323350247" state="inactive" 
         IP="111.222.333.123" LAN="Test"/>
  </system>
  ...
</xf:instance>

Я хочу построить таблицу, используя xf:repeat, чтобы перебрать все элементы <ServiceDefinition> в экземпляре 'results'. Каждая строка содержит столбец «Статус», в который я хочу поместить информацию о «состоянии» из экземпляра «домен».

Это код XForms для таблицы:

    <div class="table">
    <table border="0">
       <thead>
          <tr>
             <th class="sysName">Hostname</th>
                  <th class="services">Service</th>
                  <th class="os">OS Class</th>
                  <th class="location">Location</th>
                  <th class="link">Details</th>
                  <th>Status</th>
                </tr>
              </thead>
              <tbody>
              <xf:repeat nodeset="instance('results')/result/ServiceDefinition" id="link-repeat">
                <tr>
                  <td class="sysName"><xf:output ref="SystemName"  /></td>
                  <td>
                    <xf:repeat nodeset="Service" class="row">
                      <div>
                        <xf:output ref="."/>
                      </div>
                    </xf:repeat>
                  </td>
                  <td class="os"><xf:output ref="OSClass"/> </td>
                  <td class="location"><xf:output ref="Location" /></td>
                  <td class="link">
                    <xf:trigger submission="view-entry" appearance="minimal" class="url">
                      <xf:label>View</xf:label>
                      <xf:action ev:event="DOMActivate">
                        <xf:setvalue ref="instance('URL-container')" 
                                   value="concat('serviceDetails.xql?svc=', instance('results')/result/ServiceDefinition[index('link-repeat')]/InventoryLabel)"/>
                        <xf:load ref="instance('URL-container')" />
                      </xf:action>
                    </xf:trigger>
                  </td>
                  <td>
                  <xf:output ref="instance('domain')/system[@name = instance('results')/result/ServiceDefinition[index('link-repeat')]/SystemName]/NIC/@state" />
                  </td>
                </tr>
                </xf:repeat>
                </tbody>
    </table>
    </div>

Проблема, кажется, заключается в следующем:

<td>
  <xf:output ref="instance('domain')/system[@name = instance('results')/result/ServiceDefinition[index('link-repeat')]/SystemName]/NIC/@state" />
</td>

Что-то не так с этим выражением? Я хочу получить атрибут состояния системы, который соответствует текущему узлу в операторе повтора. Однако, когда я загружаю страницу и экземпляр «results» состоит из множества элементов, я получаю ошибку Javascript:

A script on this page may be busy, or it may have stopped responding. You can stop the script now, or you can continue to see if the script will complete.
Script: http://test:8080/exist/xforms/xsltforms/xsltforms.js:771*

Линия (в данном случае 771) всегда отличается.

Когда экземпляр результата очень мал (примерно до 20 элементов), он работает как положено.

Любая помощь или предложение приветствуются, я новичок во всем этом, поэтому, пожалуйста, будьте терпеливы.

1 Ответ

0 голосов
/ 08 марта 2012

Поскольку XSLTForms имеет собственный механизм XPath, написанный на JavaScript, браузеры могут не спешить оценивать выражения, требующие навигации по множеству узлов, особенно старых версий Internet Explorer.

Производительность была недавно улучшена, и вы должны попробовать последнюю сборку в SVN-репозитории XSLTForms на sourceforge.net.

Использование функции id() позволяет значительно сократить время оценки.

Существует также специальное расширение XSLTForms для указания того, содержит ли экземпляр только данные только для чтения.

Вы пробовали Profiler (сначала нажмите F1) для измерения времени?

...