2012-10-05 62 views
1

儘管將XHTML轉換爲XHTML和XSL我有一個命名空間問題。作爲示例考慮輸入:XHTML的XSL轉換中的命名空間問題

<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head><title>Test</title></head> 
    <body> 
     <p>Remove this</p> 
    </body> 
</html> 

那麼下面轉型不工作(如不刪除<p />):

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()" name="copy"> 
     <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 

    <xsl:template match="p" /> 
</xsl:stylesheet> 

但是這一個作用:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml"> 
    <xsl:template match="@*|node()" name="copy"> 
     <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 

    <xsl:template match="xhtml:p" /> 
</xsl:stylesheet> 

我的問題問題是:如何更改XSLT以便我不必爲所有XHTML元素添加前綴,並且仍然可以匹配它們?從我到目前爲止的嘗試中,添加一個默認名稱空間(如<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" />)無法實現此目的。

感謝您的幫助!

回答

1
How can I change the XSLT so that I do not have to add prefixes to all the XHTML elements and it still get to match them? 

這是可能的,但我會recommens定義命名空間和涉及要素在這個命名空間使用preefix:

<xsl:template match="*[local-name()='p']" /> 

警告

這種技術是安全的只有在保證不存在具有相同local-name()但不同名稱空間的兩個元素的情況下。

+0

謝謝您的建議!我會遵循它。你的解決方案也適用,但我想我應該加入我的問題,我正在尋找比使用前綴更短,更方便的方法。 :-) – hielsnoppe

+0

@hielsnoppe,不客氣。使用前綴是最短和最可讀的解決方案。 –