Обычно XML-файл анализируется как целое и хранится в памяти как XDM. Таким образом, я предполагаю, что
, чем разбор дереву несколько раз
вы на самом деле имели в виде доступа к внутреннему представлению нескольких раз входных XML. На приведенном ниже рисунке это, мы говорим о исходном дереве:
(взято из Майкла Кея XSLT 2.0 и XPath 2.0 программист Справочник, стр 43)
Аналогично , xsl:variable
создает узел (или, точнее, временный документ), который хранится в памяти и к которому также необходимо получить доступ.
Теперь, что именно вы подразумеваете под оптимизацией? Вы имеете в виду время, необходимое для выполнения преобразования или использования процессора и памяти (как вы упоминаете «ресурсы» в своем вопросе)?
Кроме того, производительность зависит от реализации вашего процессора XSLT, конечно. Единственный надежный способ выяснить - на самом деле тест.
Напишите две таблицы стилей, которые отличаются только в этом отношении, то есть идентичны в противном случае. Затем пусть оба из них преобразуют один и тот же входной XML и измеряют время, которое они принимают.
Я предполагаю, что доступ к переменной происходит быстрее, и также удобнее повторять имя переменной, чем повторять полные пути при написании кода (это иногда называют «удобными переменными»).
EDIT: Заменено-то более подходящее, в качестве ответа на ваш комментарий.
Если вы на самом деле проверить это, написать две таблицы стилей:
STYLESHEET с переменной
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/root">
<xsl:copy>
<xsl:variable name="var" select="node/subnode"/>
<subnode nr="1">
<xsl:value-of select="$var"/>
</subnode>
<subnode nr="2">
<xsl:value-of select="$var"/>
</subnode>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
стилей без переменной
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/root">
<xsl:copy>
<subnode nr="1">
<xsl:value-of select="node/subnode"/>
</subnode>
<subnode nr="2">
<xsl:value-of select="node/subnode"/>
</subnode>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Прикладной к следующему входному XML:
<root>
<node>
<subnode>helloworld</subnode>
</node>
</root>
EDIT: Как было предложено @Michael Кей, я измерил среднее время в 100 пробегов ("-t и -repeat: 100 в командной строке Saxon"):
with variable: 9 ms
without variable: 9 ms
Этот не означает, что результат совпадает с вашим XSLT-процессором.
Thx для вашего ответа. Под «Оптимизацией» я имел в виду и то и другое: время выполнения преобразования и использование памяти. Сначала я хотел удалить переменные, чтобы избежать хранения контента, который я могу легко достичь. Но потом я спрашивал меня, удалят ли переменные время, необходимое для трансформации (если да, я этого не сделаю). Что касается второй части вашего ответа: этот случай является фиктивным примером для объяснения моей проблемы. На самом деле мой шаблон намного сложнее. Узел «страна» используется в сочетании с другими элементами, и нет никаких преимуществ для его размещения в определенном шаблоне. – ylerjen
Добро пожаловать. Я предположил, что это всего лишь образец: «Я полагаю, что это образец шаблона XSLT». Тем не менее, вы точно знаете, как только вы на самом деле измерили производительность. –
@ Miam84 Я редактировал мой вопрос, чтобы сделать его более информативным. Пожалуйста, смотрите. –