xslt - 复制模板添加了意外的属性

时间:2016-05-23 15:17:56

标签: xml xslt

我有以下XML文件:

<?xml version="1.0"?>
<!DOCTYPE reference PUBLIC "-//OASIS//DTD DITA Reference//EN" "dtd/reference.dtd">
<!--<!DOCTYPE reference PUBLIC "-//OASIS//DTD DITA Reference//EN" "dtd/reference.dtd">-->
<reference xml:lang="en-us" id="D609">
    <title>Body Text</title>
    <shortdesc>A short desc.</shortdesc>
    <prolog>
        <metadata/>
    </prolog>
    <refbody>
        <section/>
    </refbody>
</reference>

我只想在其中添加一些元素。 所以我只是运行这样的复制模板:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">        


  <xsl:template match="/">

    <!-- Get the DOCTYPE comment -->
    <xsl:variable name="d"
      select="//comment()[contains(.,'DOCTYPE')][1]" />
    <xsl:variable name="doctype" select="substring($d,0)" />
    <xsl:message select="$doctype" />

    <!-- Output the DOCTYPE -->
    <xsl:value-of disable-output-escaping="yes" select="$doctype" />  

    <xsl:apply-templates />  
  </xsl:template>

  <xsl:template match="comment()[contains(text(),DOCTYPE)]">
  </xsl:template>  

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>  
</xsl:stylesheet>

而不是得到我期望的完全相同的输出,我得到了:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE reference PUBLIC "-//OASIS//DTD DITA Reference//EN" "dtd/reference.dtd">
<reference xml:lang="en-us" id="D609" DTDVersion="V1.1.3"
    domains="(topic ui-d) (topic hi-d) (topic pr-d) (topic sw-d) (topic ut-d)"
    class="- topic/topic       reference/reference ">
    <title class="- topic/title ">Body Text</title>
    <shortdesc class="- topic/shortdesc ">A short desc.</shortdesc>
    <prolog class="- topic/prolog ">
        <metadata class="- topic/metadata "/>
    </prolog>
    <refbody class="- topic/body        reference/refbody ">
        <section class="- topic/section "/>
    </refbody>
</reference>

基本上,我得到每个元素的class属性。我的'参考'标签也装饰着一些神奇地创造的标签(对我而言)。

属性来自哪里?我如何摆脱它们?

我认为它可能与我尝试复制的DTD或doctype有关,但我不确定。

1 个答案:

答案 0 :(得分:1)

XSLT处理器的输入来自XML解析器,此输入的形式(逻辑上)是节点树,其详细形式由XDM数据模型定义。如果XML解析器是一个验证解析器(由DTD中的元素和属性定义驱动),那么解析器传递给XSLT引擎的树通常不仅包含源中明确存在的属性,还包含已在DTD中定义了哪些默认值。 XDM模型不区分显式和隐式属性,因此XSLT以相同的方式处理它们。

某些XSLT处理器(或XML解析器)可能具有从输入树的XDM模型中排除默认属性的选项。例如,使用Saxon,可以使用-expand:从命令行运行时关闭,或者通过Java或.NET API运行时使用类似选项。如果没有这样的选项,那么最好的办法是避免对DTD的输入进行验证;有关如何执行此操作的详细信息取决于您的XML解析器/ XSLT处理器组合。