2012-11-06 65 views
4

我一直有一段時間擺脫了我擁有的XSL問題。從隨機HTML元素中刪除xmlns屬性

基本上,我有一個匹配的模板,在另一個XSL文件中調用命名模板。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:include href="/_internal/stylesheets/core/common" /> 

    <xsl:template match="system-page"> 

     <div id="main"> 
     <div class="pageHeading"> 
      <h1><system-page-display-name />&#160;</h1> 
      <xsl:if test="current()/dynamic-metadata[name='Printable']/value='true' or current()/dynamic-metadata[name='Shareable']/value='true'"> 
       <xsl:call-template name="shareAndPrint"> 
        <xsl:with-param name="shareable" select="current()/dynamic-metadata[name='Shareable']/value" /> 
        <xsl:with-param name="printable" select="current()/dynamic-metadata[name='Printable']/value" /> 
       </xsl:call-template> 
      </xsl:if> 
     </div> 
     <xsl:copy-of select="current()//system-data-structure/html/node()"/> 
    </div> 


    </xsl:template> 

然後,在其他文件中,這裏就是我所說的模板:消息標籤:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:spring="http://www.springframework.org/tags" version="1.0"> 

<xsl:template name="shareAndPrint"> 

    <xsl:param name="shareable"/> 
    <xsl:param name="printable"/> 

    <div class="shareBar"> 
     <xsl:if test="$printable = 'true'"> 
      <a class="print" href="javascript:window.print();"><spring:message code="print.label" /></a> 
     </xsl:if> 
     <xsl:if test="$shareable = 'true'"> 
      <span class="st_sharethis" id="shareThis"></span> 
     </xsl:if> 
    </div> 

    <xsl:if test="$shareable = 'true'"> 
     <script type="text/javascript">$('#shareThis').attr('displayText','ShareThis');</script> 
     <script src="http://w.sharethis.com/button/buttons.js" type="text/javascript"></script> 
    </xsl:if> 

</xsl:template> 

如你我基本上使用XSL來生成具有春天JSP文件中看到在它翻譯我們的網站。

而我的問題基本上是不管我做什麼,XML輸出總是最終得到具有xmlns:spring =「http://www.springframework.org/tags」的HTML元素。我見過很多與這類問題有關的其他帖子,但似乎沒有任何解決方案適用於我。

下面是一些示例輸出:

<div id="main"> 
    <div class="pageHeading"><h1>CR-HTML-Static-WRS-en - test&#160;</h1> 
     <div class="shareBar" xmlns:spring="http://www.springframework.org/tags"> 
      <a class="print" href="javascript:window.print();"> 
       <spring:message code="print.label" /> 
      </a> 
      <span class="st_sharethis" id="shareThis" ></span> 
     </div> 
     <script type="text/javascript" xmlns:spring="http://www.springframework.org/tags">$('#shareThis').attr('displayText','ShareThis');</script> 
     <script src="http://w.sharethis.com/button/buttons.js" type="text/javascript" xmlns:spring="http://www.springframework.org/tags" ></script> 
    </div>TEST CR</div> 

我嘗試添加在xsl排除對結果的前綴:樣式表標籤,雖然這從HTML元素中刪除的xmlns,它就會被添加到spring:消息標記,當解析JSP(xmlns是spring:message的無效屬性)時不起作用。所以我不確定我做錯了什麼,或者我可以嘗試什麼。

請,如果任何人有任何想法或解決方案,我將不勝感激。對不起,如果我遺漏了任何東西,我會根據需要添加它。

在此先感謝。

回答

2

您希望結果包含名稱空間前綴,但不包含這些前綴的名稱空間聲明。這是用XSLT可能的,因爲這樣的XML輸出不會簡潔(wellformed) - 所以你需要做後期處理這些文件,這樣的事情:

sed -i 's# xmlns:spring="[^"]*"##g' output.html 

注:有理論上一個disable output escaping的選項 - 但它太醜陋了,並且讓你的xslt不能快速維護。我不推薦這個。

+0

嗯,謝謝你的回覆。我開始懷疑它是否可行。看來我已經嘗試了一切。我可以按照您的建議手動刪除這些屬性,我已經有一份工作可以在生成的JSP實際用於Web應用程序之前對其進行操作。 – JFranks

2

只需將exclude-result-prefixes="spring"添加到xsl:stylesheet元素即可。

默認情況下,文字結果元素(如<div>)與所有範圍內的名稱空間一起被複制到結果文檔中。如果名稱空間實際上未在元素或屬性名稱中使用,那麼exclude-result-prefixes屬性會取消該屬性。您仍然可以在spring上獲得名稱空間聲明:message元素本身,但大概這是想要的。

+0

是的我已經嘗試過使用排除結果前綴,但事情是spring:message標記不能包含xmlns屬性,否則我的JSP將無法工作。除非我當然也使用Petr Kozelka的解決方案,然後手動從彈簧中去除xmlns:消息標籤。 – JFranks