XSLT 1.0 Предварительная стратегия обработки - PullRequest
2 голосов
/ 05 января 2012

(Позвольте мне рискнуть вопросом общей стратегии, который может нарушить протокол и поставить меня в неловкое положение.)

Перед поэлементным преобразованием моего входного XML в HTML, мне нужно определить порядок, в котором элементыбудут представлены.Для этого требуется рекурсивный анализ, включая объединение упорядоченных списков и отслеживание графика, все на основе атрибутов элементов, которые должны быть представлены.

После этой обработки у меня, по сути, упорядоченный список значений атрибутов, и япредставит элементы, отсортированные по этому списку.

Какая стратегия лучше?

1) Поместите результаты предварительного анализа в глобальную переменную, которая будет представлять собой список значений атрибутов,и затем перебираем этот список, что-то вроде этого:

<xsl:variable name=orderOfPresentation>
    <xsl:call-template name="analyses">
</xsl:variable>


<xsl:template match="root">
    <xsl:for-each select="$orderOfPresentation">
        <xsl:apply-templates select="/" />
    </xsl:for-each>
</xsl:template>

или

2) Применяйте шаблоны форматирования глубоко в анализе, как только упорядоченный список был определен, без закрытия рекурсий, что-то вроде этого:

<xsl:template match="root">
    <xsl:call-template name="analysis">
        [with, as parameters, various sets of attribute nodes, extracted from the input XML]
    </xsl:call-template>
</xsl:template>


<xsl:template name="analysis">
    [recursions that include calls to sub-analysis]
</xsl:template>

<xsl:template name="sub-analysis">
    [recursions that include calls to sub-sub-analysis]]
</xsl:template>

<xsl:template name="sub-sub-analysis">
    [more work, which eventually produces an ordered list, $orderOfPresentation]
    <xsl:for-each select="$orderOfPresentation">
        <xsl:apply-templates select="/" />
    </xsl:for-each>
</xsl:template>

Первая стратегия может просто разоблачить мышление программиста на процедурном языке, но, похоже, она имеет преимущество в том, что позволяет процессору очистить себя перед тем, как продолжить делореальное преобразование.

Но XLST 1.0 (в котором я должен работать, без расширенийion) не имеет простого способа представления списка строковых значений, и (если я правильно понимаю) может передать обратно в глобальную переменную только фрагмент дерева результатов (чего я не понимаю).Таким образом, стратегия (1) кажется плохой.

Но (2), стратегия, которая вызывает все реальные преобразования изнутри рекурсии, кажется неэффективной и трудной для поддержания.

Является одним из такихстратегии лучшая практика?Или они оба свидетельствуют о растерянности ума?

Ответы [ 2 ]

1 голос
/ 06 января 2012

Как и Док Браун, я бы использовал третью стратегию: сгенерировать целевую таблицу стилей, а затем выполнить ее.Это вполне возможно сделать в браузере с небольшим количеством Javascript.

0 голосов
/ 07 января 2012

Необходимым результатом предварительной обработки является список строк (упорядоченный список значений атрибутов), поэтому:

Не обращайте внимания на тот факт, что RTF является фрагментом дерева, и просто относитесь к нему как к строке. В вызываемом шаблоне не создавайте XML-узлы, просто выводите строки, используя значение плюс разделитель.

Глобальная переменная становится просто списком строк. (Функции substring-before( , delimiter) и substring-after( , delimiter) могут сформировать небольшую попсовую функцию для списка.)

Так что получите преимущества завершения предварительной обработки (стратегия 1) вместо запуска преобразования изнутри предварительной обработки (стратегия 2), но сделайте это, думая о глобальной переменной не как RTF, а как упорядоченный список строки.

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