【问题标题】:Issue with namespaces when copying from different document xslt 2.0从不同文档 xslt 2.0 复制时出现命名空间问题
【发布时间】:2015-12-10 18:16:53
【问题描述】:

我正在使用这个样式表为 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/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>

除了复制 imgs 参数引用的文件内容外,一切正常。该文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<images>
    <item id="d1e267_1" >
    <item id="d1e398_4" />
    <item id="d1e653_5" />
<!-- etc. -->
</images>

当我像样式表中所示复制此文档时,根元素 &lt;images&gt; 也被复制到输出中,并带有一个空的 xmlns="" 属性。

<images xmlns="">
    <item id="d1e267_1" >
    <item id="d1e398_4" />
    <item id="d1e653_5" />
<!-- etc. -->
</images>

如果我将 images 元素添加到 doc 函数中,则不会复制任何内容,我猜是因为图像不在声明的默认命名空间中。我只想复制item 元素。

我如何在这里处理这个命名空间?我已经声明了一个默认命名空间(用于 ncx 文件),并且我已经声明了一个无前缀命名空间。

【问题讨论】:

    标签: xml xslt namespaces


    【解决方案1】:

    您需要转换节点然后因为复制意味着按原样复制它,具有相同的名称和命名空间,并且您的元素不在命名空间中,如果您复制它们,它们将保留在任何命名空间中,并且父元素在一个不同的命名空间,序列化程序添加xmlns="",以保持空的命名空间。

    所以将&lt;xsl:copy-of select="$imgs"/&gt; 替换为&lt;xsl:apply-templates select="$imgs/node()" mode="change-namespace"/&gt; 并添加一个模板

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

    如果您只想转换item 元素,请使用&lt;xsl:apply-templates select="$imgs/*/*" mode="change-namespace"/&gt;&lt;xsl:apply-templates xpath-default-namespace="" select="$imgs/images/item" mode="change-namespace"/&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多