防止 XSLT 1.0 生成的 HTML 元素添加 xmlns="" 属性

4
我正在创建phpdoc2的模板,并尝试找出如何防止在从我的模板创建文档时将属性xmlns="http://www.w3.org/1999/xhtml"添加到生成的HTML的根级元素中。我的模板中的.xsl文件会生成包含HTML片段的文件,这就是为什么<html>标签不是根级元素的原因。看起来phpdoc2使用XSLT v1.0,所以我的选项有点受限。经过一些搜索,最常见的答案是在每个.xsl文件的<xsl:stylesheet>标记上使用exclude-result-prefixes属性,并将其值设置为#all#default,因为您不能直接使用xmlns作为要排除的命名空间。但我尝试了这个方法,在我的模板中的每个.xsl文件上设置了exclude-result-prefixes,但它没有起作用。
请按照要求翻译以下其中一个.xsl文件的内容,这是api-doc.xsl:
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml" 
    exclude-result-prefixes="#all">

    <xsl:output indent="no" method="html"/>

    <xsl:include href="chrome.xsl"/>

    <xsl:include href="api-doc/property.xsl"/>
    <xsl:include href="api-doc/class.xsl"/>
    <xsl:include href="api-doc/constant.xsl"/>
    <xsl:include href="api-doc/function.xsl"/>
    <xsl:include href="api-doc/docblock.xsl"/>
    <xsl:include href="api-doc/file.xsl"/>

    <xsl:template name="content">
        <xsl:apply-templates select="/project/file[@path=$path]"/>
    </xsl:template>

</xsl:stylesheet>

这是api-doc/file.xsl的一部分代码:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml" 
    exclude-result-prefixes="#all">

    <xsl:output indent="no" method="html"/>

    <xsl:template match="file">
        <div class="text-content">
            <!-- ... -->
        </div>
    </xsl:template>

</xsl:stylesheet>

元素 <div class="text-content"></div> 加入了属性 xmlns="http://www.w3.org/1999/xhtml"

xsl:output 是什么样子的?你能展示一下你的 XSL 吗? - JLRishe
@JLRishe 我添加了一个 .xsl 文件的内容。 - Bill Dami
你能展示一下那些 api-doc XSLT 的样子吗?是你自己创建的还是别人创建的?如果你的结果中有 xmlns="http://www.w3.org/1999/xhtml",那么无论如何都无法通过排除命名空间前缀来移除它,因为结果实际上正在使用该命名空间。 - JLRishe
@JLRishe,我添加了api-doc/file.xsl的内容,我也创建了那个文件。 - Bill Dami
2个回答

3

正如Michael Kay所说,如果您不想在xhtml名称空间中使用

元素,请从中删除默认命名空间(xmlns="http://www.w3.org/1999/xhtml")。

否则,您可以使用构建该元素并将其命名为空的名称空间:

    <xsl:element name="div" namespace="">
        <xsl:attribute name="class">text-content</xsl:attribute>
        <xsl:text>...</xsl:text>
    </xsl:element>

2

你的示例中<div>字面结果元素位于命名空间http://www.w3.org/1999/xhtml中。如果你不想它在这个命名空间中,那就不要把它放在那个命名空间中。


好的,<div> 标签需要存在,那么我该怎么做呢?是从所有的 .xsl 文件中删除 <xsl:stylesheet> 元素中的 xmlns="http://www.w3.org/1999/xhtml" 吗?我之前一直以为这个 "default" 命名空间是必须的。 - Bill Dami
正确!如果您不想要该命名空间中的元素,为什么还要使用该命名空间呢?您似乎希望您的元素根本没有命名空间 - 因此不要给它们命名空间。 - Francis Avila
@FrancisAvila 说实话,我正在从phpdoc自带的基本模板中获取我的phpdoc模板,该模板使用这些.xsl文件,并且每个.xsl文件都使用了该命名空间。我对XSLT并不是很熟悉,所以我只是假设在被phpdoc解析以创建结果HTML文件时,该模板必须使用它才能正常工作。 - Bill Dami
如果phpdoc生成的XHTML将作为XHTML提供,则命名空间是必要的,或者至少不会有害。 - Francis Avila
我认为我的模板与我用作起点的phpdoc基础模板之间的关键区别在于,phpdoc的模板生成完整的HTML文件,从<html>开始到结束,而我的模板仅生成HTML片段,旨在包含在外部应用程序/网站中。无论如何,只需从<xsl:stylesheet>中删除命名空间即可解决问题,因此Michael的答案是正确的。但是,我接受了Daniel的答案,因为他更详细地解释了实际采取的行动。 :) - Bill Dami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接