0

私の Umbraco CMS サイトでは、コンテンツ エディターが使用するノード「ウィジェット」のリストを作成しています。これには、切り替えて表示を変更できる多くのオプションのリストが含まれています。これには、多くの場合、要素をアンカー、div、またはその他でラップすることが含まれます。XML 出力からこれらを表示するために XSLT を使用します。

私が解決策として得たのは、複数のネストされた適用テンプレートです。これにより、条件の大きなリストが作成され、多くの場合、繰り返しチェックが要求され、非常に大きくなります。管理するのは少し悪夢です。

それは次のように見えます(ただし、各選択に2つ以上のオプションがあります):

<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 つの異なるタイプのウィジェット ボックス (またはそれ以上) を選択できることです。一貫性のあるバックエンドはそれほど重要ではありません。

ありがとうございました。

4

1 に答える 1

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>
于 2013-09-18T06:44:18.737 に答える