2016-01-20 132 views
2

我已經搜索了論壇,但仍然不清楚這一點。我對這個話題很陌生。XSL模板匹配替換元素

我有正在發送到瀏覽器電子郵件客戶端(Outlook)的HTML輸出。 Outlook會覆蓋<p>標記的特徵並引入較大的間距。

我想建立一個模板匹配,用<div><span>替換所有<p>標籤。

由於複雜的原因,在這篇文章中將不會涉及到,我不能停止使用<p>標籤呈現HTML。

因此,可以說,我有:

<p xmlns="http://www.w3.org/1999/xhtml"> 
    <span>Some text</span> 
</p> 

我希望可以將輸出爲

<span>Some text</span> 

<p>標籤去除。

如果我有

<p xmlns="http://www.w3.org/1999/xhtml"> 
    <b>Some other text</b> 
</p> 

話,我將很高興與之一:

<b>Some other text</b> 

<span> 
    <b>Some other text</b> 
</span> 

正如只要它擺脫了<p>標籤。

它也需要識別<p>沒有任何屬性。

我想過像

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="p"> 
    <span> 
     <xsl:apply-templates select="@*|node()" /> 
    </span> 
</xsl:template> 

但這不起作用。 <p>標籤仍然出現。

可以編寫一個適配器,它會在將HTML發送到smtp服務器並對其進行操作之前攔截HTML,但是這種方法存在相當大的困難,我期望避免這種情況。

它甚至有可能做我想做的事情嗎?任何幫助不勝感激。

+0

你也許用標記錯誤'XSL-fo'這個問題? XSL-FO與XSLT不同。 –

+0

生成輸入XML的系統基於xsl-fo ...但您是對的,這與此問題無關。刪除標籤。歡呼聲 – solardb

回答

1

你的輸入文檔,該樣本例如:

<p xmlns="http://www.w3.org/1999/xhtml"> 
    <span>Some text</span> 
</p> 

有一個默認命名空間。這是一件好事,因爲有效的XHTML文檔必須位於命名空間中。

這意味着此名稱空間默認應用於文檔中的所有元素,您必須在XSLT樣式表中對此進行解釋。重新聲明這個命名空間有:

<xsl:stylesheet xmlns:xhtml="http://www.w3.org/1999/xhtml"> 

,並在每次從輸入文檔的元素的引用,前綴xhtml:元素:

<xsl:template match="xhtml:p"> 
    <span> 
     <xsl:apply-templates select="@*|node()" /> 
    </span> 
</xsl:template> 

這應該讓你開始。您還沒有告訴我們輸出文檔是否也應該在命名空間中。

目前,僅修改你已經有兩個模板,像

<p> 
    <span/> 
</p> 

的結構最終將成爲

<span> 
    <span/> 
</span> 

這是你可以接受嗎?如果不是這樣,必須有一個附加規則(模板)有關包含span元素p元素:

<xsl:template match="xhtml:p[xhtml:span]"> 

或許

<xsl:template match="xhtml:p[//xhtml:span]"> 
+0

謝謝。我正在使用的輸入HTML是由其他系統自動生成的,無法更改。不幸的是,這個系統強制添加我們不想要的段落標籤。當你說p標籤將改變爲span標籤時,我非常感興趣。這正是我認爲我的模板匹配會做...但它沒有這樣做。 p標籤仍然存在。必須更多的,我沒有看到。我會繼續調查。謝謝 – solardb

+0

要回答你的問題,是的,我會適應嵌套跨度標籤。在這一點上,我不再在乎如何正確地做事,只要p標籤消失了 - 它們在某些電子郵件閱讀器中引起頭痛,因爲Outlook將如何覆蓋它們的CSS行爲。 – solardb

+0

@solardb那麼,你有沒有嘗試我所建議的?在樣式表中聲明XHTML名稱空間?我並不是建議你改變輸入文件。 –