2

我使用 xslt 1.0 对 xhtml 文件进行一些操作。但我想从一个相同的副本开始。令我惊讶的是,xsl 添加了原始文件中没有的属性。请解释这个现象。我宁愿避免它,以便更容易比较源文件和结果文件。

我尝试了 xsltproc 和 msxsl。没有不同。我得到rowspancolspan添加到所有td元素。

输入:

<?xml version="1.0" encoding="windows-1250" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
<title>Anything</title>
</head>

<body>
<table>
<tr><td class="skl" >test</td><td class="kwota" >1 800,00</td></tr>
</table>
</body>                    

</html>

xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
  >
  <xsl:output method="xml"
    omit-xml-declaration="no"
    encoding="windows-1250"
    doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
  />

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

</xsl:stylesheet>

唯一的区别是这一行:

<tr><td class="skl" rowspan="1" colspan="1">test</td><td class="kwota" rowspan="1" colspan="1">1 800,00</td></tr>

针对 dtd 验证源文件没有显示错误。我可以将这些属性插入源文件以解决该问题,但我很好奇造成这种混乱的原因。

编辑:我使用从http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd 下载的原始 dtd(延迟 20 秒)

<!ATTLIST td
  %attrs;
  abbr        %Text;         #IMPLIED
  axis        CDATA          #IMPLIED
  headers     IDREFS         #IMPLIED
  scope       %Scope;        #IMPLIED
  rowspan     %Number;       "1"
  colspan     %Number;       "1"
  %cellhalign;
  %cellvalign;
  >
4

2 回答 2

4

您的 XSLT 处理器的行为非常正确。没有添加新属性。通过 DTD 引用,行跨度属性始终位于您的输入文件中。行跨度的“1”值是作为显式属性序列化还是由您的 doctype 声明隐含对模型数据没有影响。

上面的 ATTLIST 显示 rowspan 和 colspan 的默认值是 1。没有这些属性,但仍然符合 XHTML 1.1 strict 是不可能的。注释为#IMPLIED 的其他属性表示它们是可选的。

我希望能解释它。

于 2012-10-09T14:15:25.103 回答
0

在我能够测试的处理器中禁用“功能”的几种方法。

libxml

xsltproc--nodtdattr

libxslt / libxml : 加载源时不要指定XML_PARSE_DTDATTR,例如在xmlReadFile

msxml

msxsl : -xe- 不解析外部

Msxml.DomDocumentdoc.resolveExternals = Falsedoc.validateOnParse = False之前load,也禁用整个 dtd

解决外部

在 MSXML 3.0 和 MSXML 6.0 中,默认的 resolveExternals 值为 True。在 MSXML 6.0 中,默认设置为 False。

是的,这很愚蠢。但我只是从 MS 那里复制的。我猜应该是3.0 和 4.0 True,6.0 False 。

6.0 SP1 中引入的PopulateElementDefaultValues 属性有一个吸引人的描述,但它不适用于我的 dtds。

于 2012-10-10T16:46:27.753 回答