我有以下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有关,但我不确定。
答案 0 :(得分:1)
XSLT处理器的输入来自XML解析器,此输入的形式(逻辑上)是节点树,其详细形式由XDM数据模型定义。如果XML解析器是一个验证解析器(由DTD中的元素和属性定义驱动),那么解析器传递给XSLT引擎的树通常不仅包含源中明确存在的属性,还包含已在DTD中定义了哪些默认值。 XDM模型不区分显式和隐式属性,因此XSLT以相同的方式处理它们。
某些XSLT处理器(或XML解析器)可能具有从输入树的XDM模型中排除默认属性的选项。例如,使用Saxon,可以使用-expand:从命令行运行时关闭,或者通过Java或.NET API运行时使用类似选项。如果没有这样的选项,那么最好的办法是避免对DTD的输入进行验证;有关如何执行此操作的详细信息取决于您的XML解析器/ XSLT处理器组合。