Xpath функционируют для удаления пробела

Хорошо, после 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 .

7
задан allyLogan 5 December 2009 в 16:07
поделиться

2 ответа

Как указывает Тим ​​Робинсон, translate поможет. (Я бы не назвал это «взломом», но потом я уже давно нахожусь на стадии «отождествления с моими мучителями» в моих отношениях с XSLT.) Ваш код будет намного более читабельным, если вы используете что-то вроде этого :

<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/>
<xsl:variable name="ws" value=" &#13;&#10;&#09"/>

... который является частью файла 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, которые делают то же самое.

6
ответ дан 7 December 2019 в 03:16
поделиться

Удаляет пробелы в начале и конце, но не в середине. Есть предложения?

Вы можете использовать translate ('& # 13; & # 10;', '') , чтобы убрать пробелы, символы новой строки и возврата каретки. Если вы используете классы .NET или MSXSL для преобразования, тогда будет немного сложно преобразовать символы в нижний регистр. Один из приемов, который я использовал, - использовать transform для преобразования букв верхнего регистра в их аналоги в нижнем регистре; другой - написать объект расширения .NET для обеспечения функции нижнего регистра . Функция нижнего регистра встроена в XPath / XSL 2.0.

Во второй части вашего вопроса они делают разные вещи:

  • помещает значение непосредственно в HTML
  • создает атрибут для текущего элемента HTML и присваивает ему значение
  • объявляет переменную XSL, не затрагивая HTML. Вы можете записать эту переменную в HTML, используя .
3
ответ дан 7 December 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: