XSLT document (): медленнее ли вызывать его несколько раз? - PullRequest
8 голосов
/ 10 мая 2011

ОБНОВЛЕНИЕ 17 июля 2013 года :
XALAN 2.7 не кэширует document() вызовов в запросе. Поэтому крайне важно хранить каждый необходимый документ в переменной в XSL.


Я долго искал и не нашел конкретных ответов на мой простой вопрос:

Какой подход быстрее или компилятор "умный", чтобы оба варианта были одинаковыми?

Примечание. Я использую Xalan 2.7 (реализация по умолчанию в JDK 1.6):

1) Мне нужно прочитать свойство во внешнем XML:

<xsl:value-of select="document($path)/person/address/city"/>

Когда мне нужен город, я использую приведенное выше выражение (скажем, 100 раз)

2) Вместо того, чтобы вызывать document () 100 раз, я сохраняю узел XML в переменной:

<xsl:variable name="node" select="document($path)"/>

А потом я использую 100 раз

<xsl:value-of select="$node/person/address/city"/>

Какой из них быстрее, лучше и по каким причинам? Спасибо!

Ответы [ 2 ]

3 голосов
/ 10 мая 2011

Оба метода должны выполняться в одно и то же время, если процессор XSLT не является наивным , поскольку функция документа должна возвращать одинаковый результат при вызове с одинаковыми аргументами, независимо от того, сколькораз.

Оба метода неэффективны из-за использования аббревиатуры //, которая приводит к обходу всего дерева документа.

Я бырекомендуем следующие более эффективные, чем обсуждаемые оба метода:

<xsl:variable name="vCities" select="document($pUrl)//cities"/>

тогда только ссылка $vCities.

Таким образом, вы прошлидокумент только один раз.

2 голосов
/ 10 мая 2011

Кажется, вы понимаете принципы, которые вам нужны, поэтому вам не нужны никакие объяснения.

Если вы хотите узнать, как это делает Xalan 2.7, окончательный ответ будет найден при тестировании его с помощью Xalan 2.7 с достаточно большим тестом.

Как заметил @Dimitre, ни один из них не обязательно эффективен из-за //, хотя некоторые процессоры умны оптимизировать такие пути, смягчая проблему. Вы могли бы помочь процессору быть более эффективным, сохранив элемент city в переменной:

<xsl:variable name="city" select="(document($path)//city)[1]"/>
...
<xsl:value-of select="$city"/>

Я добавил туда [1] для дальнейшей оптимизации, потому что вы сказали «город» (т.е. вы ожидаете только один), и это позволяет интеллектуальному процессору останавливаться после того, как он находит первый city элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...