XSLT: шаблон вызова против режима для потока выполнения - PullRequest
4 голосов
/ 17 сентября 2010

Какую практику лучше использовать для потока выполнения, шаблона вызова или режимов?

data.xml

<Properties>
    <foo>me</foo>
    <bar>you</bar>
</Properties>

a.xsl

<xsl:include href="translations_nomodes.xml"
<xsl:template match="/">
    <xsl:call-template name="a_display"/>
</xsl:template>

b.xsl

<xsl:include href="translations_nomodes.xml"
<xsl:template match="/">
    <xsl:call-template name="b_display"/>
</xsl:template>

translations_nomodes.xsl

<xsl:template name="a_display">
    <!-- display option a -->
    ...
</xsl:template>

<xsl:template name="b_display">
    <!-- display option b -->
    ...
</xsl:template>

Или было бы лучше использовать режимы

c.xsl

<xsl:include href="translations_modes.xml"
<xsl:template match="/">
    <xsl:apply-templates select="/Properties" mode="c_display"/>
</xsl:template>

d.xsl

<xsl:include href="translations_modes.xml"
<xsl:template match="/">
    <xsl:apply-templates select="/Properties" mode="d_display"/>
</xsl:template>

translations_modes.xsl

<xsl:template match="Properties" mode="c_display">
    <!-- display option c -->
    ...
</xsl:template>

<xsl:template match="Properties" mode="d_display">
    <!-- display option d -->
    ...
</xsl:template>

Поскольку «Свойства» является корневым узлом в моем документе, а шаблоны применений используют литералы для значений режима, использование режима не даст мне никакого дополнительного преимущества, и оно немного более многословно. Однако, если поток выполнения зависит от элемента / атрибута в самом документе, и режимы были не литералами, а выражениями, тогда я мог бы видеть необходимость подхода режима.

На самом деле, использование режимов как я, с буквальными значениями, кажется плохим выбором также потому, что если в будущем моя логика изменится, и мне нужно будет использовать выражения режима для управления потоком выполнения, я уже «использовал» Атрибут режима.

Я пришел к правильному выводу или пропустил некоторые важные моменты?

Ответы [ 2 ]

3 голосов
/ 18 мая 2012

Немного опоздал на ответ на этот вопрос. Одно большое различие между apply-templates и call-template заключается в том, что в последнем случае вызываемый шаблон наследует текущий узел (иногда называемый узлом контекста) вызывающей стороны. Принимая во внимание, что с apply-template select = "expr" определяет режим контекста, генерируя список узлов и затем повторяя их.

Используя ваши примеры, a.xsl и b.xsl оба соответствуют "/". Когда они вызывают-template a_display и b_display в translations_nomodes.xsl, эти шаблоны наследуют "/" как узел контекста.

Напротив, шаблоны в c.xsl и d.xsl apply-templates с select = "/ Properties". Поскольку существует только один «/ Properties», это единственный узел в списке, для которого выполняется итерация, и он становится контекстным узлом, для которого процессор XSLT ищет наилучшее соответствие. Таким образом, шаблоны в translations_modes.xsl будут видеть "/ Properties" как узел контекста.

Так, что является лучшей практикой? Зависит от того, хотите ли вы продолжить обработку с текущего узла контекста или выбрать другие узлы, чтобы начать обработку заново.

Надеюсь, это поможет.

0 голосов
/ 17 сентября 2010

Помните: XSLT (как любой декларативный язык) связывает вход с хорошо известной схемой с выходом с известной схемой. Не существует такого понятия, как «общее решение».

Глядя на ваш пример, это факты:

  • Ваш источник ввода имеет Properties корневой элемент.
  • Ваша логика процесса не покоится на XSLT, но по вашему решению: запустить одно преобразование или другое.

Итак, почему у вас была общая таблица стилей с отдельной логикой и две таблицы стилей "точки входа" для каждой логики? Это не имеет смысла.

Лучше всего иметь две таблицы стилей.

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