используя один кусок данных XML в нескольких местах - PullRequest
1 голос
/ 17 января 2010

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

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

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

Ответы [ 2 ]

1 голос
/ 18 января 2010

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

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

Вы можете использовать <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" (и использовать режим атрибут тоже во всех call-шаблонах и apply-templates) и все шаблоны в 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>
0 голосов
/ 01 января 2011

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

Используйте это

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

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

, а не это

<xsl:template match="test/entry">
    <!-- content -->
</xsl:template>
...