使用XSLT的多层条件包装HTML

时间:2013-06-28 13:26:59

标签: 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 个答案:

答案 0 :(得分:0)

 <!--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>