Используя один кусок данных XML в нескольких местах

Как вы преобразуете раздел документа XML несколько раз?

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

Как мне заставить работать обе таблицы стилей?

2 ответа

Сложно диагностировать, не видя таблицы стилей, но я подозреваю, что ваша импортируемая таблица стилей и импортированная таблица стилей имеют шаблоны с одинаковыми критериями соответствия или одинаковыми именами, а импортируемая таблица стилей "переопределила" импортированный шаблон таблицы стилей, что не позволяет его выполнить.

Импортированные таблицы стилей имеют более низкий приоритет, чем шаблоны в вашей таблице стилей верхнего уровня.

Ты можешь использовать <xsl:apply-imports /> в вашем основном шаблоне таблицы стилей, чтобы применить импортированный шаблон для этого узла.

<xsl:template match="foo">
  <!--First, turn foo into bar -->
  <bar>
    <xsl:apply-templates />
  </bar>
  <!--Now, apply the template from the imported file to do whatever it does-->
  <xsl:apply-imports />
</xsl:template>

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

http://www.dpawson.co.uk/xsl/sect2/modes.html

Например, если вы хотите применить style1.xsl или style2.xsl из style.xsl, вы можете определить все шаблоны в style1.xsl с помощью mode="style1" (и использовать атрибут mode во всех call-template и apply- шаблоны) и все шаблоны в style2.xsl с mode="style2".

Тогда вы можете получить таблицу стилей style.xsl, которая содержит:

<xsl:include href="style1.xsl"/>
<xsl:include href="style2.xsl"/>

<xsl:template match="some pattern">
  <xsl:choose>
    <xsl:when test="some test">
      <xsl:apply-templates select="." mode="style1"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates select="." mode="style2"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Если возможно, используйте имя шаблона, а не соответствие данных.

Использовать этот

<xsl:call-template name="test" />

<xsl:template name="test">
    <!-- content -->
</xsl:template>

не это

<xsl:template match="test/entry">
    <!-- content -->
</xsl:template>
Другие вопросы по тегам