2013-10-16 37 views
1

在編寫符合XML標準的JSP時,很難根據輸入生成不同的HTML標籤(例如,在輸出<table>中的不同標籤時)。XSLT <xsl:element>在JSP中等價嗎?

標準解決方案是使用ifchoose標籤,但在HTML標籤內共享代碼成爲問題。例如。

<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中的任何標籤庫中是否有這樣的標籤?

回答

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> 


或者,下面的技巧(由 @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> 
+0

這不是有效的XML,這與一些自動化工具,我用的干擾。 –

+1

@ billc.cn你可以使用例如''而不是'',這將爲您提供有效的XML。但是,這將是一種黑客。 – Uooo

+0

我最終做了類似於@ Uooo的評論。由於我們的XML閱讀器未配置爲驗證HTML名稱空間中的標記,因此這種黑客行爲有效。 –

0

編號JSP需要在構建樹時瞭解標記。這使得JSP的操作更加強大

但是,您可以通過將重複代碼分解爲單獨的JSP文件幷包含它,具體取決於您使用的JSP的實現。

或者,您可以創建一個包含100行代碼的JSP標記。這可能不值得。

最後,你可以,而不是使用thtd,使用上td樣式打造td樣子th。這將使元素看起來像

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

我知道我沒有風格完全正確的,但你可以使用styleClass,而不是在你的CSS用它玩。

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} 
+0

+1爲我的答案作出貢獻。謝謝。 –