2

私は大学のコンピューティング クラブのために XML と XSLT に関する Pressentation を準備しています。私は専門家ではありませんが、他の誰よりも優れています。そのため、スライドには XML ドキュメントを使用することにしました。次に、XSLT 2.0 を使用して一連の Web ページに変換します。

これでソースドキュメントができました

<slideshow>
  <slide title="Example">
    <para>Below is an example of an XML document</para>
    <code> <![CDATA[
<?xml version="1.0"?>
<elephant Name="Fido">
  <head>
    <eyes qty="2" colour="blue"/>
    <trunk/>
    <ears qty="2"/>
  </head>
  <body>
    Thin, ribs showning
  </body>
  <legs qty="4">
    Roughly 1.5m Long
  </legs>
</elephant> ]]>
    </code>
  </slide>
</slideshow>

私の例が文書の XML 構造の一部を形成することを望まない (そして XSLT によって変更されることを望まない) ので、CDATA セクションがあります。だから、私が<code>...</code>要素を持っているときはいつでも、それは常に書かれています: <code><![CDATA[...]]></code> これは情報の複製です。

codeすべての要素に (解析されていない) 文字データのみが含まれていると宣言することはできますか?

だから私はただ書くだけ <code>...</code>で、中身を解析しようとはしませんでした。

おそらくDTDでできることのように思えますか?


私が探している答えは、

<!DECLARE-CDATA-ELEMENT code>コード要素を作成し、そのコンテンツを解析しないものを使用 します。


エンティティでシミュレートできます:

<!ENTITY CodeStart "<code><![CDATA["> 
<!ENTITY CodeEnd "]]></code>">

次に使用します:&CodeStart;<don'tParse/>&CodeEmd;


いいえ、できませんが、すべてのコードセクションに子要素が含まれないようにすることはできます...


いいえ、しかし、次のような前処理を行うことができます: ...


これらは答えではなく、答えがどのようなものかを示しているだけです (うまくいけば、これはより明確になりました)

4

4 に答える 4

2

私の例が文書の XML 構造の一部を形成することを望まない (そして XSLT によって変更されることを望まない) ので、CDATA セクションがあります。

code一部の XML フラグメントが「XSLT によって変更」されるのを防ぐために CDATA セクションを使用する必要はありません。要素をルートとするサブツリーをコピーするように XSLT コードを記述します

すべてのコード要素に (解析されていない) 文字データのみが含まれていると宣言することは可能ですか?

はい。ただし、XSLT では、ソース XML ドキュメントまたは処理の結果に対して DTD が存在する必要はありません(スキーマ対応の XSLT 2.0 は、これらおよび中間結果さえも検証できますが、XML スキーマ (XSD) でのみ機能します)。 )、そしてそのような DTD がある場合、XSLT は型情報を使用しません (唯一の例外は ID 属性があるという事実です)。したがって、そのような DTD を提供しても役に立ちません。

また、そのような DTD は、少なくとも&<の子 text-node 内のすべての文字code文字をエスケープしない限り、違反します。

W3C XML 仕様から:

「[定義: マークアップではないすべてのテキストは、ドキュメントの文字データを構成します。] アンパサンド文字 (&) と左山かっこ (<) は、マークアップの区切り文字として使用される場合を除き、リテラル形式で表示してはなりません。コメント、処理命令、または CDATA セクション。他の場所で必要な場合は、数字参照または文字列 " & " と " < " をそれぞれ使用してエスケープする必要があります

于 2012-04-21T03:40:41.533 に答える
2

セクションと CDATA セクションの関係についてのあなたの主張はわかりますcode。一方が他方なしで存在しない場合、そのうちの 1 つは多くの情報を持っていません。しかし、いいえ、他の答えはまったく正しいですcode。要素を別の方法で解析する必要があると宣言する方法はありません。

価値のあることとして、SGML DTD にはCDATAキーワードを使用して要素を宣言する機能があります。これは、「この要素内のすべてがマークアップではなく文字データであるため、ここでは区切り文字を認識しないでください」という意味です。もちろん、要素の終わりを認識したいので、物事はかなり複雑になり、CDATA宣言は(すべての複雑さの後でさえ)あなたが説明するユースケースではうまくいきません。

そのため、Andrew Cooke が言及した動機がなかったとしても、XML でディープ 6CDATA要素宣言を行った可能性があります。宣言によってパーサーの動作を変更できるようにする機能により、DTD を読み取らずに解析することは不可能になります。

したがって、あなたが異議を唱える冗長性は、基本的に、2 つの異なる対象者に対応しているという事実の結果です。CDATAマークされたセクションは、何をどのように解析するかについてパーサーとcode対話し、要素は下流のアプリ (たとえば、XSLT スタイルシート) と対話します。ドキュメントの論理構造について。単純なプロセスを慎重に階層化すると冗長性が高まるという一般原則の小さな例。

あなたのプレゼンテーションがうまくいったことを願っています。

于 2012-08-22T01:00:14.393 に答える
1

サンプルドキュメントを埋め込むのではなく、それらを参照する傾向があります。

<code ref="example1.xml"/>
于 2012-04-21T16:50:55.477 に答える
1

まず、私はこれを行うメカニズムを知りません。

第二に、xml 標準についての私の理解が限られているため、あなたが望むものが存在するとは思えません。xml 仕様には、DTD のない (または必要に応じて「前」の) xml ドキュメントに適用される「整形式」の概念があり、CDATA のないドキュメントは整形式ではありません。

つまり、xml ドキュメントは、それ自体で特定のルールに従う必要があります。あなたが求めているのは、これらのルールがDTDによって緩和/変更されることですが、DTDは整形式に加えてさらなるチェックを提供するだけであり(「有効な」ドキュメントにつながります)、整形式の要件を変更することはできません.

しかし、私は優れたxmlの専門家ではありません...

ps 問題は<?xml... ?>パーツにあります。別の答えが言うように、ドキュメント内に直接xml要素を埋め込むことができます(その場合、「含む」xmlと「埋め込まれた」xmlの違いをより明確にしたい場合は、xml名前空間をより明確に見てください)。

于 2012-04-21T03:34:10.793 に答える