2011-02-24 10 views
6

Questo è il mio input xml.Elementi di corrispondenza con prefisso namespace in 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> 

e la mia XSLT inizia come ..

<?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> 

Sto usando XSLT 1.0 e il pacchetto modello non è sempre abbinato. Quando rimuovo lo spazio dei nomi xmlns="http://www.idpf.org/2007/opf" nel nodo del pacchetto, il modello viene abbinato. Come posso far corrispondere il mio modello senza rimuovere gli spazi dei nomi.

Per favore aiutatemi. Grazie in anticipo.

+0

possibile duplicato del [lo script XSLT non funziona quando un namespace è dichiarata nel nodo principale] (http://stackoverflow.com/questions/4964152/xslt-sc ript-doesnt-work-when-a-namespace-è-dichiarato-nel-nodo-radice) –

risposta

19

Aggiungi gli spazi dei nomi nel foglio di stile.

<?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

È l'unico modo per farlo a proposito? Devi 'hardcode' il prefisso 'xxx:' all'interno della partita stessa, o c'è un'altra opzione per 'globalmente' definire modelli che coprono solo un particolare spazio dei nomi? – monojohnny

0

XSLT comprende gli spazi dei nomi QNames definiti in input XML.

In aggiunta alla risposta di cui sopra possiamo dare qualsiasi nome al nostro spazio dei nomi xsl.

XML di input ha definizione come xmlns: dc = "http://purl.org/dc/elements/1.1/" e gli elementi sono definisce prefisso dc

È possibile definire un foglio di stile di seguito:

<?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

Prova questo per ignorare lo spazio dei nomi:

<xsl:template match="*[local-name()='package']"> 
    <xsl:message>Entering package</xsl:message> 
</xsl:template> 
Problemi correlati