Как профилировать и оптимизировать XSLT?

У меня есть XSLT для просмотра XML файлов в браузере. XSLT наивно написан и в настоящее время занимает много времени (несколько минут).

Мой XML файл имеет скромный размер (~ 1 MiB), а другие XSLT для одного и того же документа, которые выполняют разные обработки, выполняются намного быстрее. Поэтому я знаю, что проблема не в размере XML, это мой XSLT.

Как мне выполнить профилирование и оптимизацию моего XSLT?

(Неплохо ли делать сложные XSLT в браузере? Должен ли я вместо этого применять XSLT-приложение?)

Ответ 1

какой движок XSLT вы используете? Если вы используете движок.NET и Visual Studio, вы можете использовать профилировщик XSLT, интегрированный в Visual Studio, что очень полезно.

Другими превосходными инструментами для профилирования являются Altova XML Spy и Oxygen.

Если вы разместите свой XSLT, вам будет проще рассказать вам, где это возможно, узкие места. В общем, будьте осторожны с выражениями XPath, такими как "//", предшествующие :: * и следующие :: *. Некоторые правила и лучшие практики:

  1. Избегайте повторного использования "//item".
  2. Не оценивайте один и тот же набор узлов более одного раза; сохраните его в переменной.
  3. Избегайте <xsl:number> если можете. Например, используя position().
  4. Используйте <xsl:key>, например, чтобы решить проблемы группировки.
  5. Избегайте сложных шаблонов в правилах шаблонов. Вместо этого используйте правило.
  6. Будьте внимательны при использовании preceding[-sibling] или following[-sibling] осей. Это часто указывает алгоритм с n-квадратичной производительностью.
  7. Не сортируйте один и тот же узел несколько раз. При необходимости сохраните его как фрагмент дерева результатов и получите доступ к нему с помощью функции расширения node-set().
  8. Чтобы вывести текстовое значение простого элемента #PCDATA, используйте <xsl:value-of> в предпочтении <xsl:apply-templates>.

(от http://www.dpawson.co.uk/xsl/sect4/N9883.html#d15756e150)

Следуя этим правилам, как правило, приводит к очень эффективному XSLT, и вам, возможно, не понадобится использовать профилировщик вообще.

Что касается вашего вопроса о XSLT в браузере: я бы не рекомендовал его, потому что сначала вы не независимы от платформы (не каждый браузер может его поддерживать, либо некоторые браузеры могут поддерживать его только с плохо работающим движком), а во-вторых, вы не можете управлять двигатель б/у.

Ответ 2

Если вы предоставляете XSLT-код и XML-документ, на котором вы наблюдаете эту проблему, я и другие люди могут попытаться помочь.

Вот несколько XSLT и советы по повышению производительности от Michael Kay

Восемь советов по эффективному использованию XSLT:

  • Храните исходные документы в малом размере. При необходимости сначала разделите документ.
  • Храните процессор XSLT (и Java VM), загруженный в память между запусками
  • Если вы используете одну и ту же таблицу стилей, сначала скомпилируйте ее.
  • Если вы используете один и тот же исходный документ несколько раз, сохраните его в памяти.
  • Если вы повторяете одно и то же преобразование, не делайте этого. Сохраните результат вместо этого.
  • Сохраняйте выходной документ небольшим. Например, если вы создаете HTML, используйте CSS.
  • Никогда не проверяйте один и тот же исходный документ более одного раза.
  • Сплит комплексные преобразования на несколько этапов.

Восемь советов по написанию эффективных X SLT:

  • Избегайте повторного использования "//item".
  • Не оценивайте один и тот же node -set более одного раза; сохраните его в переменной.
  • Избегайте <xsl:number>, если можете. Например, используя position().
  • Используйте <xsl:key>, например, чтобы решить проблемы группировки.
  • Избегайте сложных шаблонов в правилах шаблонов. Вместо этого используйте правило <xsl:choose> в правиле.
  • Будьте осторожны при использовании preceding[-sibling] или following[-sibling] Оси. Это часто указывает алгоритм с производительностью n -squared.
  • Не сортируйте один и тот же node -set более одного раза. При необходимости сохраните его как фрагмент дерева результатов и получить доступ к нему с помощью функции расширения node-set().
  • Чтобы вывести текстовое значение простого элемента #PCDATA, используйте <xsl:value-of> в предпочтении до <xsl:apply-templates>.

Ответ 3

Коммерческий Редактор Oxygen XML имеет функцию профилирования и отладки файлов XSLT. Это хороший редактор XML.

Ответ 4

Мне нравится использовать Altova XMLSpy для компьютеров на базе Windows. Он также имеет встроенный профилировщик. Вы можете проверить видео при использовании редактора. (сканирование до 5:45, чтобы узнать больше о профилировщике). Это коммерческий продукт... с периодом времени:)