我使用xslt 1.0对xhtml文件进行一些操作。但我想从一个相同的副本开始。令我惊讶的是 xsl添加了原始文件中缺少的属性。请解释一下这种现象。我宁愿避免使它更容易比较源文件和结果文件。
我尝试了xsltproc和msxsl。没有不同。我将rowspan
和colspan
添加到所有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;
>
答案 0 :(得分:4)
您的XSLT处理器运行正常。没有添加新属性。 rowspan属性始终通过DTD引用输入到输入文件中。将rowspan的值“1”序列化为显式属性或者doctype声明隐含的值对模型数据没有影响。
上面的ATTLIST显示rowspan和colspan的默认值为1. 不没有办法拥有这些属性并且仍然符合XHTML 1.1 strict。注释为#IMPLIED的其他属性意味着它们是可选的。
我希望能够解释它。
答案 1 :(得分:0)
在我能够测试的处理器中禁用“功能”的几种方法。
xsltproc :--nodtdattr
libxslt / libxml :加载源时不要指定XML_PARSE_DTDATTR
,例如xmlReadFile
msxsl :-xe
- 不解决外部问题
Msxml.DomDocument :doc.resolveExternals = False
和doc.validateOnParse = False
load
之前,还会禁用整个dtd
是的,那是愚蠢的。但我只是从MS复制它。应该 3.0和4.0 True,6.0 False 我猜。 6.0 SP1中引入的在MSXML 3.0和MSXML 6.0中,默认的resolveExternals值为True。在MSXML 6.0中,默认设置为False。
PopulateElementDefaultValues Property有一个很有吸引力的描述,但它不适用于dtds。