2011-02-24 75 views
6

這是我的xml輸入。在XSLT中匹配具有命名空間前綴的元素

<package version="2.0" unique-identifier="uuid_id" 
     xmlns="http://www.idpf.org/2007/opf"> 
    <metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:opf="http://www.idpf.org/2007/opf" 
      xmlns:dcterms="http://purl.org/dc/terms/" 
      xmlns:calibre="http://calibre.kovidgoyal.net/2009/metadata" 
      xmlns:dc="http://purl.org/dc/elements/1.1/"> 
    <meta name="calibre:series_index" content="1"/> 
    <dc:language>UND</dc:language> 
    <dc:creator opf:file-as="Marquez, Gabriel Garcia" 
       opf:role="aut" 
       >Gabriel Garcia Marquez</dc:creator> 
    <meta name="calibre:timestamp" content="2010-07-14T21:35:15.266000+00:00"/> 
    <dc:title>Cem Anos de Solidão</dc:title> 
    <meta name="cover" content="cover"/> 
    <dc:date>2010-07-14T21:35:15.266000+00:00</dc:date> 
    <dc:contributor opf:role="bkp" 
        >calibre (0.7.4) [http://calibre-ebook.com]</dc:contributor> 
    <dc:identifier id="uuid_id" opf:scheme="uuid" 
        >7e11dc8b-55cb-4411-8f30-df974fbcf58a</dc:identifier> 
    </metadata> 
    <manifest> 
</package> 

和我的XSLT開始喜歡..

<?xml version="1.0" encoding="ISO-8859-1"?> 
<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="package"> 
    <xsl:message>Entering package</xsl:message> 
</xsl:template> 

我使用XSLT 1.0和模板包是沒有得到匹配。當我在包節點中刪除命名空間xmlns="http://www.idpf.org/2007/opf"時,模板會得到匹配。如何讓我的模板匹配而不刪除命名空間。

請幫幫我。提前致謝。

+0

的[當一個命名空間中根節點聲明XSLT腳本不起作用]可能重複(http://stackoverflow.com/questions/4964152/XSLT-SC ript-doesnt-work-when-a-namespace-is-decla-in-the-root-node) – 2011-02-24 16:59:05

回答

19

在樣式表中添加名稱空間。

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml" 
    xmlns:opf="http://www.idpf.org/2007/opf"> 

<xsl:template match="opf:package"> 
    <xsl:message>Entering package</xsl:message> 
</xsl:template> 
+2

順便說一句,這是否是唯一的方法?你是否必須在匹配本身中'硬編碼''xxx:'前綴,還是有另一種選擇來'全局'定義僅覆蓋特定命名空間的模板? – monojohnny 2011-04-21 08:39:58

0

XSLT瞭解在輸入XML中定義的名稱空間QName。

除了上面的答案,我們可以給我們的xsl命名空間任何名稱。

輸入XML具有定義的xmlns:DC = 「http://purl.org/dc/elements/1.1/」 和元素定義爲直流前綴

可以定義以下一個樣式表:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml" 
    xmlns:purl="http://purl.org/dc/elements/1.1/" 
    xmlns:idpf="http://www.idpf.org/2007/opf"> 
<xsl:template match="idpf:package/purl:language"> 
<xsl:message>Entering package. Selected Language.</xsl:message> 
</xsl:template> 
0

試試這個忽略的命名空間:

<xsl:template match="*[local-name()='package']"> 
    <xsl:message>Entering package</xsl:message> 
</xsl:template> 
相關問題