Многослойная условная оболочка 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>