Используя один кусок данных 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>