2

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 からダウンロードした(20秒の遅延で)元のdtdを使用し
ます

<!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であることを示しています。これらの属性を持たにXHTML1.1strictに準拠する方法はありません。#IMPLIEDとして注釈が付けられた他の属性は、それらがオプションであることを意味します。

それがそれを説明することを願っています。

于 2012-10-09T14:15:25.103 に答える
0

テストできたプロセッサの「機能」を無効にするいくつかの方法。

libxml

xsltproc--nodtdattr

libxslt / libxml :たとえばxmlReadFileXML_PARSE_DTDATTRで、ソースをロードするときに指定しないでください

msxml

msxsl-xe-外部を解決しない

Msxml.DomDocumentdoc.resolveExternals = Falseおよびそのdoc.validateOnParse = False前にload、dtd全体も無効にします

resolveExternals

MSXML3.0およびMSXML6.0では、デフォルトのresolveExternals値はTrueです。MSXML 6.0では、デフォルト設定はFalseです。

ええ、それは愚かです。しかし、私はそれをMSからコピーしただけです。3.0と4.0True、 6.0Falseである必要があります。

6.0 SP1で導入されたPopulateElementDefaultValuesプロパティには魅力的な説明がありますが、dtdsでは機能しません。

于 2012-10-10T16:46:27.753 に答える