2013-11-06 7 views
2

У меня есть несколько XSLT типов контента, которые до сих пор использовались независимо друг от друга. I.e .: content-type-A.xml =>content-type-A.xslt. Однако последнее изменение требует от них объединения, поскольку новые документы будут содержать агрегированный контент из нескольких типов контента.Режим шаблона по умолчанию XSLT?

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

Есть ли способ объявить режим по умолчанию для шаблона - или обходной путь для достижения эквивалента? По сути, я хочу объявить как только режим для шаблона, и после этого: все шаблоны находятся в этом режиме, если не указано, и все применяемые шаблоны относятся к этому режиму, если не указано.

+2

Вы правы, что эта функция будет полезна, и она была добавлена ​​в XSLT 3.0. Однако в 2.0 вы можете автоматизировать процесс добавления определенного режима для каждого элемента xsl: template и xsl: apply-templates, который в настоящее время не хватает. –

+0

Это одна из приятных вещей, когда XSLT является XML - вы можете написать одну таблицу стилей, задачей которой является изменение другой. –

ответ

2

XML NamespacesXML Namespaces - это обычный способ решения проблем распознавания и столкновения, возникающих при использовании разрозненных словарей разметки в одном документе XML. Кроме того, если вы хотите поддерживать XSD для входных документов типа контента отдельно, и если вы также хотите иметь XSD, который управляет недавно объединенным XML-документом, пространство имен XML поможет привнести здравомыслие в определение и преобразование разметки.

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

+0

Я считал это, но, к сожалению, в этом случае он был бы намного более разрушительным из-за приложения, построенного на рассматриваемом XML. – wst

+0

+1, я согласен, что пространства имен будут идеальными, но контент определяется в DTD в другой части рабочего процесса, над которыми я имею меньшее влияние. – wst

0

использовать XSLT 3.0-совместимый процессор, который поддерживает default-mode:

http://www.w3.org/TR/xslt-30/#default-mode

+0

Я нашел это в спецификации, и хотя XSLT 2.1 не является вариантом для моего решения, я хотел включить его для полноты. – wst

+1

Обратите внимание, что XSLT 2.1 был перенумерован на XSLT 3.0, а текущий черновик - на http://www.w3.org/TR/xslt-30/ –

+0

Спасибо @MichaelKay. Обновлено. – wst

1

Генерировать XSLTs с режимами добавлены с помощью XSLT (как это было предложено доктором Кей). Это добавляет режим принятый в качестве переменной таблицы стилей в режиме по умолчанию, при сохранении существующих режимов:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xso="dummy" version="2.0"> 
    <xsl:output method="xml" xml:space="preserve" indent="no" encoding="UTF-8" /> 
    <xsl:namespace-alias stylesheet-prefix="xso" result-prefix="xsl" /> 
    <xsl:param name="mode" required="yes" /> 
    <xsl:template match="xsl:template"> 
     <xso:template mode="{ (@mode, $mode)[1] }"> 
     <xsl:apply-templates select="@* except @mode|node()" /> 
     </xso:template> 
    </xsl:template> 
    <xsl:template match="xsl:apply-templates"> 
     <xso:apply-templates mode="{ (@mode, '#current')[1] }"> 
     <xsl:apply-templates select="@* except @mode|node()" /> 
     </xso:apply-templates> 
    </xsl:template> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
Смежные вопросы