我有以下XML(文件:emcsh.xml
):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="tohtml.xsl"?>
...
<root>
<el>
<d>Some text with <kbd>code</kbd> and <em>prose</em>.</d>
</el>
</root>
使用以下转换(文件:tohtml.xsl
):
<?xml version='1.0' encoding='utf-8'?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
...
<xsl:template match="d">
<xsl:copy-of select="node() | @*"/>
</xsl:template>
...
<xsl:if test="d">
<div class="tipper">
<xsl:apply-templates select="d"/>
</div>
</xsl:if>
使用以下管道处理文件后:
$ xsltproc tohtml.xsl emcsh.xml > emcsh.html && xmllint --format emcsh.html -o emcsh.html
结果字符串是:
...
<div class="tipper">
Some text with <kbd xmlns="">code</kbd> and <em xmlns="">prose</em>.
</div>
...
几乎完美,但如何在没有空属性xmlns=""
的情况下进行转换?
感谢。
答案 0 :(得分:1)
这种情况正在发生,因为XSLT的默认命名空间是http://www.w3.org/1999/xhtml
,这意味着文字元素(如那里的<div>
)将位于该命名空间中。
当它复制{null}命名空间中的<kbd>
时,它会插入xmlns=""
以指示命名空间的更改。
保持http://www.w3.org/1999/xhtml
默认命名空间且输出中没有xmlns=""
的唯一方法是让XSLT将输入元素转换为http://www.w3.org/1999/xhtml
命名空间。
你可以这样做:
<?xml version='1.0' encoding='utf-8'?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
...
<xsl:template match="d">
<xsl:apply-templates select="node() | @*"/>
</xsl:template>
<xsl:template match="d//*">
<xsl:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml">
<xsl:apply-templates select="node() | @*" />
</xsl:element>
</xsl:template>
...
<xsl:if test="d">
<div class="tipper">
<xsl:apply-templates select="d"/>
</div>
</xsl:if>