Многослойная условная оболочка HTML с XSLT

На моем сайте Umbraco CMS я делаю список "виджетов" узлов для редакторов контента со списком многих опций, которые они могут переключать для изменения отображения. Это часто включает в себя обёртывание элемента якорем, div или чем-то ещё. Используя XSLT для отображения их из вывода XML, я собрал подход kludge, так как я новичок в XSLT.

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

Это выглядит как таковое (но с более чем двумя вариантами в каждом выборе):

<xsl:template match="/">
<xsl:choose>
    <xsl:when test="type='1'">
        <xsl:apply-templates select="widgetContent" mode="type_1" />
    </xsl:when>
    <xsl:otherwise>
        <xsl:apply-templates select="widgetContent" mode="type_default" />
    </xsl:otherwise>
</xsl:choose>
</xsl:template>

<xsl:template match="wigetContent" mode="type_1">
<xsl:choose>
    <xsl:when test="./wrap_with_hyperlink != 0">
        <xsl:element name="a">
        <xsl:apply-templates select="." mode="hyperlink_wrapped" />
        </xsl:element>
    </xsl:when>
    <xsl:otherwise>
        <xsl:apply-templates select="widgetContent" mode="not_hyperlink_wrapped" />
    </xsl:otherwise>
</xsl:choose>
</xsl:template>

Что я могу сделать, чтобы уменьшить этот запутанный беспорядок? Я структурировал условия так, чтобы они были как можно больше сверху вниз, но есть определенно повторяющиеся проверки, когда type_2 должен снова и снова задавать те же вопросы, что и type_1.

(редактировать: ясность) Поскольку дизайн в основном является луком, type_1 обернут определенными тегами, type_2 обернут различными тегами. Следующий слой, оба могут быть обернуты одинаковыми тегами и так далее. Что было бы идеально, это:

<xsl:if test="this_wrap_style = 1"><xsl:element name="abc"></xsl:if>
<xsl:if test="this_wrap_style = 2"><xsl:element name="xyz"></xsl:if>
(everything else) 
</abc> //if it exist.
</xyz> //etc

Который определенно не работает.

Некоторое из этого было уменьшено за счет использования Umbraco Doc Types для различных элементов управления виджетами, но часть природы заключается в том, что для идеальной структуры для редакторов контента выбор виджета блока даст им 5 различных типов блоков виджетов (или более) на выбор от, и последовательный конец не так важен.

Спасибо всем за ваше время.

1 ответ

 <!--Store data in processing instruction nodes in a separate XML file-->
 <?xml version='1.0' encoding="utf-8"?>
 <root>
   <?_1 div?>
   <?_2 p?>
 </root>

type_1 обернут определенными тегами, type_2 обернут различными тегами.

 <xsl:variable name="divider" select="document('condition.xml')//processing-instruction(concat('_', $type) )" />
 <xsl:variable name="equalizer" select="'span'"/>
 <xsl:element name="{$divider}">
 ...
 </xsl:element>

Следующий слой, оба могут быть обернуты одинаковыми тегами

 <xsl:if test="contains('1,2',$type)">
   <xsl:element name="{$equalizer}">
   ...
   </xsl:element>
 </xsl:if>
Другие вопросы по тегам