2010-07-31 66 views
2

我是XSLT的新手,但它被認爲是完成特定任務的一種方式。我有一堆希望從中刪除側邊欄的xhtml文件。側邊欄包含在< div class =「foo」>元素中。XSLT轉換一個XHTML文檔

我可以使用這個答案中的指令成功地執行標識轉換:How to remove elements from xml using xslt with stylesheet and xsltproc?但我似乎無法匹配我想要刪除的元素。也許這是因爲他們不是頂級元素,就像我在這個設計模式的每個例子中都能找到的一樣?

有人可以解釋正確的方式來刪除< div class =「foo」>及其所有的孩子從身份轉換?

+0

好問題(+1)。查看我的答案以獲得詳細的解決方案和解釋。 – 2010-08-01 01:06:26

回答

4

由於源XHTML文件中的默認(xhtml)名稱空間(您沒有向我們顯示,因此這是個猜測),您的問題很有可能出現。

有人可以解釋的正確方法 刪除,並從身份所有 孩子變換?

這裏是如何的情況下做到這一點默認命名空間是存在

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xhtml="http://www.w3.org/1999/xhtml"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="xhtml:div[@class='foo']"/> 
</xsl:stylesheet> 

當下面的XHTML文檔應用這種轉變:

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <div class="class1"> 
     <p>Text1</p> 
    </div> 
    <div class="foo"> 
     <p>Text foo</p> 
    </div> 
    <div class="class2"> 
     <p>Text2</p> 
    </div> 
</html> 

想要的,正確的結果產生

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <div class="class1"> 
     <p>Text1</p> 
    </div> 
    <div class="class2"> 
     <p>Text2</p> 
    </div> 
</html> 

模板的匹配表達式使用命名空間前綴是必要的,因爲XPath的在「沒有命名空間」和匹配的表達與非前綴名認爲任何前綴的名稱不匹配的任何節點,因爲它指定「no namspace」中的節點,但源文檔的所有節點都位於XHTML名稱空間中。

在情況下,存在源文檔中沒有默認命名空間,變換可以被簡化

當下面的XML文檔應用這種轉變(請注意,它並沒有定義一個默認的命名空間):

<html> 
    <div class="class1"> 
     <p>Text1</p> 
    </div> 
    <div class="foo"> 
     <p>Text foo</p> 
    </div> 
    <div class="class2"> 
     <p>Text2</p> 
    </div> 
</html> 

想要的,正確的結果產生

<html> 
    <div class="class1"> 
     <p>Text1</p> 
    </div> 
    <div class="class2"> 
     <p>Text2</p> 
    </div> 
</html> 

這兩種轉換都使用身份規則來複制文檔和另一個模板的任何節點,該模板將覆蓋與匹配的節點的身份規則"div[@class='foo']"。這第二個模板是空的(沒有主體),這意味着匹配的節點和根源於其中的子樹根本不會被處理(忽略),因此不會出現在輸出中。

+0

您的代碼有效,但爲什麼不能正常工作: jbtx 2010-08-02 00:29:53

+0

我最終使用了兩個樣式表:一個去掉元素和第二個添加正確的DTD語句。 – jbtx 2010-08-02 00:57:43

+0

@jbtx:爲什麼,它爲我崇拜。我在輸出開始處:'<!DOCTYPE html PUBLIC「 - // W3C // DTD XHTML 1.0 Transitional // EN」「http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional .dtd「>'。您的XSLT處理器可能有問題嗎?我的結果由Saxon 6.5.4,MSXML 3-6,AltovaXML(XML-SPY),Saxon 9.1.07和XML-SPY-XSLT2.0生成。如果您使用兩種可用的.NET XSLT處理器之一,則必須微調作爲參數傳遞給「Transform()」方法的'XmlWriter'的設置。閱讀您的文檔。 – 2010-08-02 02:21:21