如何为<xsl:element ... =“”> productions指定默认命名空间?

时间:2016-10-13 12:05:06

标签: firefox xslt xhtml

我有一个带有未命名命名空间的XML,想象如下:

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="<see below>" ?>
<root>
    <child>Hello</child>
</root>

我打算用XSLT转换为X(HT)ML树。我想要逃避的一些事情是:

  1. 不要在转换样式表(下面)中使用“xsl:”前缀。这是为了草率,虽然我记得我可能会为减少输入我的XSL代码而付出代价,因为在输入其他内容时会有额外的冗长。无论如何,我想看看它是如何通过使用未加前缀的XSL语法来实现的。

  2. 我正在输出HTML作为XHTML(因此通过扩展,符合XML的)树。不是文本而不是“HTML文本” - 输出方法是“xml”。这是为了使用户代理不必解析[HTML]文本。

  3. 我想使用XSL element元素来生成结果树。没有输入'&lt;'后跟元素名称,后跟'&gt;'。

  4. 基本上,我想看看如何进行通用XML-&gt; XML转换,其中生成的树是XHTML节点或文档,与HTML 5兼容。

    未完成的 XSL样式表文件,其格式为:

    <?xml version="1.0" encoding="utf-8" ?>
    <stylesheet xmlns="http://www.w3.org/1999/XSL/Transform">
        <output method="xml" />
        <template match="/">
            <element name="h1">
                <text>Hello World.</text>
            </element>
        </template>
    </stylesheet>
    

    我打算将HTML的htmlbody元素作为h1的祖先,并实际转换源节点。但是这个例子足以说明我即将发生的问题 - 我希望结果树中的h1元素属于其合法的XHTML名称空间。如果没有element节点通过namespace属性显式命名空间声明,则用户代理似乎将其解释为名为h1的未知节点。很公平,我猜。

    我不想做的是将namespace="http://www.w3.org/1999/xhtml"添加到element XSL元素的每个实例中,显然我可能有几十个。可悲的是,这似乎是我唯一的选择。如果我使用XSL名称空间作为样式表文档的默认名称,那么我能否以某种方式暗示结果树元素默认属于XHTML名称空间?

    我理解我的变态角可能是大多数人明确使用xsl:前缀的原因,但我想避免它,因为毕竟XSL是文档的命名空间。但如果它是XSLT 1.0的限制,那么我会承认。

    Firefox 48对XML进行转换和渲染。

1 个答案:

答案 0 :(得分:1)

大多数人都使用xsl:前缀,因为这样做很方便。除此之外,它还允许您将另一个名称空间定义为默认名称空间,从而避免需要为每个element指令和每个文字结果元素显式添加名称空间。

在您的示例中,您可以简单地将另一个前缀绑定到XHTML命名空间并使用它而不是完整的命名空间:

<stylesheet version="1.0" 
xmlns="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.w3.org/1999/xhtml">
<output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<template match="/">
    <element name="x:h1">
        <text>Hello World.</text>
    </element>
</template>

</stylesheet>

或(同样的事):

<stylesheet version="1.0" 
xmlns="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.w3.org/1999/xhtml">
<output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<template match="/">
    <x:h1>
        <text>Hello World.</text>
    </x:h1>
</template>

</stylesheet>

另请注意,默认命名空间是继承的。您可以将XHML名称空间声明为输出树根级别的默认名称,并使其所有后代继承它。这里的问题是你的XSLT指令必须被排除在外:

<stylesheet version="1.0" 
xmlns="http://www.w3.org/1999/XSL/Transform">
<output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <body>
            <text xmlns="http://www.w3.org/1999/XSL/Transform">Hello World.</text>
        </body>
    </html>
</template>

</stylesheet>

希望您现在明白为什么使用xsl:这样的前缀是标准的。