Хорошо, после Jeffrey L Whitledge сказал , что не было никакого различия в производительности (по состоянию на 1997), я пошел и протестировал его. Я выполнил этот маленький сравнительный тест:
public class Main {
private static final int NUM_TESTS = 100;
private static int ITERATIONS = 1000000;
// time counters
private static long inTime = 0L;
private static long aroundTime = 0L;
public static void main(String[] args) {
for (int i = 0; i < NUM_TESTS; i++) {
test();
ITERATIONS += 1; // so the tests don't always return the same number
}
System.out.println("Inside loop: " + (inTime/1000000.0) + " ms.");
System.out.println("Around loop: " + (aroundTime/1000000.0) + " ms.");
}
public static void test() {
aroundTime += testAround();
inTime += testIn();
}
public static long testIn() {
long start = System.nanoTime();
Integer i = tryInLoop();
long ret = System.nanoTime() - start;
System.out.println(i); // don't optimize it away
return ret;
}
public static long testAround() {
long start = System.nanoTime();
Integer i = tryAroundLoop();
long ret = System.nanoTime() - start;
System.out.println(i); // don't optimize it away
return ret;
}
public static Integer tryInLoop() {
int count = 0;
for (int i = 0; i < ITERATIONS; i++) {
try {
count = Integer.parseInt(Integer.toString(count)) + 1;
} catch (NumberFormatException ex) {
return null;
}
}
return count;
}
public static Integer tryAroundLoop() {
int count = 0;
try {
for (int i = 0; i < ITERATIONS; i++) {
count = Integer.parseInt(Integer.toString(count)) + 1;
}
return count;
} catch (NumberFormatException ex) {
return null;
}
}
}
я проверил получающийся байт-код с помощью javap, чтобы удостовериться, что ничто не было встроено.
результаты показали, что, принимая незначительную оптимизацию JIT, Jeffrey корректен ; существует абсолютно никакое различие в производительности на Java 6, клиент VM Sun (у меня не было доступа к другим версиям). Различие общего времени находится на порядке нескольких миллисекунд по всему тесту.
Поэтому единственное соображение что самые чистые взгляды. Я нахожу, что второй путь ужасен, таким образом, я буду придерживаться или первого пути или путь Ray Hayes .
Как указывает Тим Робинсон, translate
поможет. (Я бы не назвал это «взломом», но потом я уже давно нахожусь на стадии «отождествления с моими мучителями» в моих отношениях с XSLT.) Ваш код будет намного более читабельным, если вы используете что-то вроде этого :
<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/>
<xsl:variable name="ws" value=" 	"/>
... который является частью файла globals.xslt
, который я включаю в начало большинства преобразований, которые я пишу. Затем это:
<xsl:value-of select="translate(x, concat($uc, $ws), $lc)"/>
переводит каждую заглавную букву в ее строчный эквивалент, а каждый пробельный символ - в ничто.
Обычно вы используете xsl: variable
, чтобы сделать код более читабельным ( как в приведенном выше примере) или для хранения промежуточных результатов, которые иначе нельзя эффективно вычислить. Четвертый способ вывода данных - это тот, о котором вы не упомянули, а именно: Чертовски полезно: шаблон значения атрибута. Все они делают то же самое:
<link>
<xsl:attribute name="name">
<xsl:value-of select="translate(name, concat($uc, $ws), $lc)"/>
</xsl:attribute>
</link>
<link>
<xsl:attribute name="name" value="translate(name, concat($uc, $ws), $lc)"/>
</link>
<xsl:variable name="linkName" value="translate(name, concat($uc, $ws), $lc)"/>
<link name="{$linkName}"/>
В данном конкретном случае, это спорно, какой из двух последних проще и понятнее. Однако в большинстве случаев это не так: разделение вычисления значений и того, как они вставляются в вывод, упрощает понимание того и другого, как и использование AVT вместо более подробных конструкций XSLT, которые делают то же самое.
Удаляет пробелы в начале и конце, но не в середине. Есть предложения?
Вы можете использовать translate ('& # 13; & # 10;', '')
, чтобы убрать пробелы, символы новой строки и возврата каретки. Если вы используете классы .NET или MSXSL для преобразования, тогда будет немного сложно преобразовать символы в нижний регистр. Один из приемов, который я использовал, - использовать transform
для преобразования букв верхнего регистра в их аналоги в нижнем регистре; другой - написать объект расширения .NET для обеспечения функции нижнего регистра
. Функция нижнего регистра
встроена в XPath / XSL 2.0.
Во второй части вашего вопроса они делают разные вещи:
помещает значение непосредственно в HTML
создает атрибут для текущего элемента HTML и присваивает ему значение
объявляет переменную XSL, не затрагивая HTML. Вы можете записать эту переменную в HTML, используя
.