2011-02-24 39 views
6

Đây là đầu vào xml của tôi.Các yếu tố phù hợp với tiền tố không gian tên trong 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> 

và XSLT của tôi bắt đầu như ..

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

Tôi đang sử dụng XSLT 1.0 và gói mẫu là không nhận được phù hợp. Khi tôi loại bỏ không gian tên xmlns="http://www.idpf.org/2007/opf" trong nút gói, mẫu được khớp. Làm thế nào tôi có thể làm cho mẫu của tôi để phù hợp mà không cần loại bỏ các không gian tên.

Hãy giúp tôi. Cảm ơn trước.

+0

thể trùng lặp của [XSLT kịch bản không hoạt động khi một không gian tên được khai báo trong nút gốc] (http://stackoverflow.com/questions/4964152/xslt-sc ript-doesnt-work-when-a-namespace-được-khai báo-in-the-root-node) –

Trả lời

19

Thêm các không gian tên trong biểu định kiểu của bạn.

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

Đó có phải là cách duy nhất để thực hiện nó bằng cách này? Bạn có phải 'hardcode' tiền tố 'xxx:' trong chính kết hợp đó không, hoặc có một tùy chọn khác để 'toàn cầu' xác định các mẫu chỉ bao gồm một không gian tên cụ thể không? – monojohnny

0

XSLT hiểu các không gian tên QNames được xác định trong XML đầu vào.

Ngoài câu trả lời ở trên, chúng tôi có thể cung cấp bất kỳ tên nào cho không gian tên xsl của chúng tôi.

Input xml có định nghĩa như xmlns: dc = "http://purl.org/dc/elements/1.1/" và các yếu tố là định nghĩa như tiền tố dc

Bạn có thể định nghĩa một kiểu dưới đây:

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

Hãy thử điều này để bỏ qua không gian tên:

<xsl:template match="*[local-name()='package']"> 
    <xsl:message>Entering package</xsl:message> 
</xsl:template> 
Các vấn đề liên quan