(Позвольте мне рискнуть вопросом общей стратегии, который может нарушить протокол и поставить меня в неловкое положение.)
Перед поэлементным преобразованием моего входного 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), стратегия, которая вызывает все реальные преобразования изнутри рекурсии, кажется неэффективной и трудной для поддержания.
Является одним из такихстратегии лучшая практика?Или они оба свидетельствуют о растерянности ума?