我怎样才能有条件地将某些东西包裹在 HTML 元素中

How can I envelope something in HTML element conditionally

在使用 JSF、JSTL 和 Trinidad 创建的页面上,我有一些调用了很多属性的标记。

<tr:selectBooleanRadio
        group="#{groupId}"
        id="#{groupId}_#{Id}_radio"
        selected="#{value.yesterday}"
        text="#{msg.ib_selectTimeIntervalRadio_yesterday_label}"
        shortDesc="#{ib:fn_coalesce(title,label)}"
        simple="#{ib:fn_coalesce(simple,true)}"
        styleClass="#{ib:fn_coalesce(styleClass,'selectTimeIntervalRadio')}"/>

我想在 <td> 元素中或直接有条件地显示它。现在我这样做:

<c:when test="#{not horizontal}">
    <tr>
        <td>
            <tr....>
        </td>
    </tr>
</c:when>
<c:when test="#{horizontal}">
    <tr...>
</c:when>

这样我重复了两次相同的代码,这显然是不好的。我能做什么?

恕我直言,为 tr... 调用创建新的自定义组件是没有用的 - 调用它会遇到所有相同的问题。

也许,我可以有条件地将一个标签包裹在另一个标签中?可以吗?

另一种方法可能是:将 tr... 标签放在某种变量中,并在构造此变量时使用相同的标签。也许,有可能?

你知道另一种避免代码重复的方法吗?

如果您使用的是旧版 JSP,请将其包装在 <f:verbatim> 中。

<f:verbatim rendered="#{not horizontal}"><tr><td></f:verbatim>
    <tr:selectBooleanRadio ... />
<f:verbatim rendered="#{not horizontal}"></td></tr></f:verbatim>

如果您正在使用 JSPX 或 Facelets,这会在上述构造上产生 XML 错误,这在 XML 中是非法的,请将其转义为 <h:outputText escape="false">.

<h:outputText value="&lt;tr&gt;&lt;td&gt;" escape="false" rendered="#{not horizontal}" />
    <tr:selectBooleanRadio ... />
<h:outputText value="&lt;/td&gt;&lt;/tr&gt;" escape="false" rendered="#{not horizontal}" />