XSLT дубликаты шаблонов с включениями - PullRequest
4 голосов
/ 18 февраля 2011

У меня проблема с включением шаблонов xslt.

У меня есть a.xslt, который включает в себя b.xslt и c.xslt.

b и c оба требуют шаблон, расположенный в d.xslt. Если я добавлю оператор включения в b и c, я получу ошибку шаблона в VS2008:

The named template 'MyTemplate' does not exist. 

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

Если я включу d.xslt в a.xslt, он будет отображаться правильно, но я получаю ошибку в b и c о том, что шаблон, на который я ссылаюсь, не существует:

'MyTemplate' is a duplicate template name.  

Каким был бы правильный способ иметь такое дерево включений? Или, может быть, это проблема VS2008?

Я мог бы удалить d.xslt и добавить этот шаблон к b и c, но проще управлять, если шаблон находится в одном месте.

  • отредактировано: добавлен текст ошибки VS2008.

Ответы [ 3 ]

10 голосов
/ 18 февраля 2011

Использование xsl:include - это то же самое, что вставка их всех в один гигантский файл, что также приведет к тем же ошибкам дублирования шаблона.

Использование xsl:import вместо xsl:include.
Это наложение / объединение всех шаблонов, чтобы дать вам супер-набор.Последний шаблон в цепочке импорта будет «выигрывать» вместо того, чтобы выдавать вам ошибку определения дубликата, поскольку он будет иметь более высокий приоритет.

  • Иметь a.xslt xsl:import b.xslt и c.xslt,
  • Иметь b.xslt и c.xslt xsl:include или xsl:import d.xslt.

Лично я всегда склонен использовать xsl:import сверх xsl:include.

Единственный реальный недостаток xsl:import заключается в том, что вы можете случайно переопределить шаблон дальше в цепочке импорта и не знать его (потому что вы не получите ту же ошибку компиляции, что и с xsl:include).Может быть небольшое снижение производительности, поскольку процессору XSLT нужно «подумать» немного больше о цепочке импорта, но я не нашел в этом проблемы.

1 голос
/ 18 февраля 2011

IDE, такие как VS2008, склонны полагать, что когда вы редактируете документ таблицы стилей, он должен быть полным, то есть вместе с тем, что он включает / импортирует, все имена должны разрешаться. На самом деле это не относится к языку XSLT; когда A включает B, вполне допустимо, чтобы компоненты в B ссылались на компоненты в A, даже если B не включает A. Я считаю, что у oXygen есть переключатель, который позволяет вам управлять этим. XSLT допускает циклические включения, но они могут вызвать проблемы с некоторыми процессорами.

0 голосов
/ 21 февраля 2011

С http://www.w3.org/TR/xslt#named-templates

Ошибка, если таблица стилей содержит более одного шаблона с одинаковым именем и одинаковым приоритетом импорта .

Это также показывает, что механизм xsl:import лучше, чем включение (в большинстве случаев), и его следует рассматривать как механизм наследования между преобразованиями.

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