JSP中的XSLT <xsl:element>等价物?</xsl:element>

时间:2013-10-16 12:40:19

标签: java jsp

在编写符合XML的JSP时,很难根据输入生成不同的HTML标记(例如,在<table>中输出不同的标记时)。

标准解决方案是使用ifchoose标记,但在HTML标记内共享代码会成为问题。 E.g。

<c:choose>
 <c:when test="${i.tag = 'th'}><th> <!-- 100 lines of code --> </th></c:when>
 <c:when test="${i.tag = 'td'}><td> <!-- 100 lines of code duplicated?! --> </td></c:when>
</c:choose>

XSLT提供<xsl:element>标记,允许您使用标准XML语法构建标记及其属性。 JSP中的任何标记库中都有这样的标记吗?

3 个答案:

答案 0 :(得分:1)

你不应该这样做吗?

<c:choose>
 <c:when test="${i.tag = 'th'}"><th></c:when>
 <c:when test="${i.tag = 'td'}"><td></c:when>
</c:choose>
 <!-- 100 lines of code --> 
<c:choose>
 <c:when test="${i.tag = 'th'}"></th></c:when>
 <c:when test="${i.tag = 'td'}"></td></c:when>
</c:choose>

<小时/> 如果您希望您的标记是有效的XML;使用自定义标记包装您想要避免重复的所有Java代码。您的标记看起来像

<c:choose>
 <c:when test="${i.tag = 'th'}">
  <th>
   <my:customTag anyAttributes="th-related-values-if-any" ... />
  </th>
 </c:when>
 <c:when test="${i.tag = 'td'}">
  <td>
   <my:customTag anyAttributes="td-related-values-if-any" ... />
  </td>
 </c:when>
</c:choose>

<小时/> 或者,以下hack(由 @Uooo 建议)可用于传递XML验证器。

<c:choose>
 <c:when test="${i.tag = 'th'}"><c:out value="&lt;th&gt%" /></c:when>
 <c:when test="${i.tag = 'td'}"><c:out value="&lt;td&gt%" /></c:when>
</c:choose>
 <!-- 100 lines of code --> 
<c:choose>
 <c:when test="${i.tag = 'th'}"><c:out value="&lt;/th&gt%" /></c:when>
 <c:when test="${i.tag = 'td'}"><c:out value="&lt;/td&gt%" /></c:when>
</c:choose>

答案 1 :(得分:1)

您可以创建一个包含“100行代码”的单独JSP,并将其包含在内。

将您的<!-- 100 lines of code -->替换为:

<jsp:include page="hundredLines.jsp">
    <jsp:param name="beanParam" value="beanValue"/>
</jsp:include>

在您的hundredLines.jsp

Bean can be used like ${beanParam}

答案 2 :(得分:0)

没有。 JSP需要在构建树时知道标记。这使得JSP的操作更加健壮

但是,您可以通过将重复代码分解为单独的JSP文件并将其包含在内来解决重复代码,具体取决于您使用的JSP的实现。

或者,您可以创建一个包含100行代码的JSP标记。这样做可能不值得。

最后,您可以使用th上的样式而不是使用tdtd来使td看起来像th。这会使元素看起来像

<td style="${i.tag == 'th' ? '' : 'font-style: bold; text-align: center;'}">
  100 lines of code
</td>

我知道我的风格不是很正确,但您可以使用styleClass代替并在CSS中使用它。