由於源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']"
。這第二個模板是空的(沒有主體),這意味着匹配的節點和根源於其中的子樹根本不會被處理(忽略),因此不會出現在輸出中。
好問題(+1)。查看我的答案以獲得詳細的解決方案和解釋。 – 2010-08-01 01:06:26