我有一个带有未命名命名空间的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树。我想要逃避的一些事情是:
不要在转换样式表(下面)中使用“xsl:”前缀。这是为了草率,虽然我记得我可能会为减少输入我的XSL代码而付出代价,因为在输入其他内容时会有额外的冗长。无论如何,我想看看它是如何通过使用未加前缀的XSL语法来实现的。
我正在输出HTML作为XHTML(因此通过扩展,符合XML的)树。不是文本而不是“HTML文本” - 输出方法是“xml”。这是为了使用户代理不必解析[HTML]文本。
我想使用XSL element
元素来生成结果树。没有输入'&lt;'后跟元素名称,后跟'&gt;'。
基本上,我想看看如何进行通用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的html
和body
元素作为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进行转换和渲染。
答案 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:
这样的前缀是标准的。