Xml 从不同的文档xslt 2.0复制时出现名称空间问题
我使用此样式表为epub创建一个opf文件,使用ncx文件(epub中的目录)作为主要输入:Xml 从不同的文档xslt 2.0复制时出现名称空间问题,xml,xslt,namespaces,Xml,Xslt,Namespaces,我使用此样式表为epub创建一个opf文件,使用ncx文件(epub中的目录)作为主要输入: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:fn='http://www.w3.org/2005
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:fn='http://www.w3.org/2005/xpath-functions' exclude-result-prefixes='xsl xs fn' xpath-default-namespace="http://www.daisy.org/z3986/2005/ncx/" xmlns="http://www.idpf.org/2007/opf" xmlns:dc="http://purl.org/dc/elements/1.1/" >
<xsl:output method='xml' version='1.0' encoding='UTF-8' indent='no'/>
<xsl:param name="imgs" select="doc('../../EPUB/images.xml')" />
<xsl:template match='/'>
<xsl:result-document href="EPUB/META-INF/container.xml" method="xml" encoding="UTF-8">
<container xmlns="urn:oasis:names:tc:opendocument:xmlns:container" version="1.0">
<rootfiles>
<rootfile full-path="OPS/output.opf" media-type="application/oebps-package+xml"/>
</rootfiles>
</container>
</xsl:result-document>
<package version="2.0" unique-identifier="ID100">
<metadata>
<dc:title>E-Pub</dc:title>
<dc:language>de</dc:language>
<dc:identifier id="ID100">epub</dc:identifier>
<dc:creator>sd</dc:creator>
</metadata>
<manifest>
<item id="nav" href="nav.ncx" media-type="application/x-dtbncx+xml"/>
<item id="css" href="Style/styles.css" media-type="text/css"/>
<xsl:apply-templates select="//navPoint[content]"/>
<xsl:copy-of select="$imgs"/>
</manifest>
<spine toc="nav">
<xsl:apply-templates select="//navPoint[content]" mode="toc"/>
</spine>
</package>
</xsl:template>
<xsl:template match="ncx">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="head">
</xsl:template>
<xsl:template match="meta">
</xsl:template>
<xsl:template match="docTitle">
</xsl:template>
<xsl:template match="navMap">
</xsl:template>
<xsl:template match="navLabel">
</xsl:template>
<xsl:template match="text">
</xsl:template>
<xsl:template match="navPoint[content]">
<item id="{@id}" href="{content/@src}" media-type="application/xhtml+xml"/>
</xsl:template>
<xsl:template match="navPoint[content]" mode="toc">
<itemref idref="{@id}"/>
</xsl:template>
</xsl:stylesheet>
如果我将images
元素添加到doc函数中,则不会复制任何内容,因为images不在声明的默认名称空间中。我只想复制项
元素
在这里如何处理这个名称空间?我已经声明了一个默认名称空间(对于ncx文件),并且我已经声明了一个不固定的名称空间。您需要转换节点,因为复制意味着使用相同的名称和名称空间按原样复制它,并且您的元素不在任何名称空间中,如果复制它们,它们将保留在任何名称空间中,并且由于父节点位于不同的名称空间中,序列化程序添加
xmlns=”“
,以维护空命名空间
因此,将
替换为
,并添加一个模板
<xsl:template match="*" mode="change-namespace">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="change-namespace"/>
</xsl:element>
</xsl:template>
如果您只想转换
项
元素,那么使用
或
您需要转换节点,因为复制意味着以相同的名称和命名空间复制它,并且您的元素不在任何命名空间中,如果复制它们,它们将保留在任何命名空间中,并且由于父节点位于不同的命名空间中,序列化程序添加xmlns=”“
,以维护空命名空间
因此,将
替换为
,并添加一个模板
<xsl:template match="*" mode="change-namespace">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="change-namespace"/>
</xsl:element>
</xsl:template>
如果只想转换项
元素,请使用
或
<xsl:template match="*" mode="change-namespace">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="change-namespace"/>
</xsl:element>
</xsl:template>