复制XML的整个节点而不使用'xmlns =“”'

时间:2017-11-10 12:15:21

标签: xml xslt xml-namespaces

我有以下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=""的情况下进行转换?

感谢。

1 个答案:

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