6

<xsl:element>私は最近XSLTを使い始めましたが、要素を定義するために使用することと、XSLTでそれらをリテラルとして宣言することとの効果的な違いは何でしょうか。たとえば、小さなXMLドキュメントのコンテンツを(x)HTMLに変換する単純化されたケースを考えてみましょう。

1.私は道を行くことができました<xsl:element>

<xsl:element name="h1">
    <xsl:value-of select="heading"/>
</xsl:element>

2.または、要素を手動で定義します。

<h1>
    <xsl:value-of select="heading"/>
</h1>

これら2つの実際の違いは何ですか?違いが存在する場合、どちらが「良いスタイル」と見なされますか?

4

4 に答える 4

8

それらはほとんど同じですが、リテラル要素がスタイルシート<h1>のその時点でスコープ内にある名前空間ノードを結果ツリーに追加するのに対し、は追加しないという点が異なります。これが出力にどのような違いをもたらすかは、スタイルシートに含まれる名前空間宣言と、結果ツリーのどこでそれらを使用するかによって異なります。たとえば、次の変換を入力XMLドキュメントに対して実行します。<xsl:element name="h1">

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:foo="http://example.com">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/">
    <root>
      <foo:element1 />
      <foo:element2 />
    </root>
  </xsl:template>
</xsl:stylesheet>

次の出力を生成します(xsltprocを使用)。

<?xml version="1.0"?>
<root xmlns:foo="http://example.com">
  <foo:element1/>
  <foo:element2/>
</root>

<root>ただし、スタイルシートのリテラルを<xsl:element name="root">代わりにに変更すると、

<?xml version="1.0"?>
<root>
  <foo:element1 xmlns:foo="http://example.com"/>
  <foo:element2 xmlns:foo="http://example.com"/>
</root>

フォームは<xsl:element>「foo」名前空間ノードを生成された要素にアタッチしないためです。これが重要で、実際にスタイルシートの名前空間宣言を作成する要素にコピーしたい場合は、<xsl:element>次のようなものをネストすることでコピーできます。

<xsl:copy-of select="document('')/*/namespace::foo" />

その中に直接(document('')スタイルシートXMLドキュメント自体へのアクセスを提供するイディオムを使用)。

ただし、一般的に、の主な用途は<xsl:element>、「コンパイル時」のリテラルではなく、要素名が計算される場合です。

于 2012-09-24T16:30:05.040 に答える
4

xsl:elementを使用すると、スタイルシートを作成するときに名前がわからない要素や、名前が動的に作成される要素を定義できます。可能であれば、常にインライン定義を(つまり手動で)使用します。短くて読みやすいと思います。

于 2012-09-24T16:29:54.367 に答える
1

回答にまだ記載されていないもう1つの技術的な違い:xsl:elementコンストラクターに制限すると、スタイルシートはXSLTのDTDに対して有効になる可能性があります。一部の環境(たとえば、DTD対応のエディターがある場合)では、これが有利な場合があります。そうは言っても、XSLTの構築をガイドするために実際にDTDを使用する人はいないと何度も言われています(私を除いて)。

形而上学的な違いもあります(文字通りの結果要素は、タグの乱用の一形態と見なすことができます。これはh1、意味がこれは第1レベルの見出しです」ではなく、「第1レベルの見出しをここに置く」という意味で使用しているためです。 ")、しかしこれは主にマークアップ理論家と言語デザイナーにとって興味深いものです。完全を期すためだけに言及します。

于 2012-09-24T16:58:20.060 に答える
1

可能な限り、リテラルの結果要素を使用することを強くお勧めします

したがって、要素の名前が事前にわかっていて(動的に決定されない)、名前空間の操作が必要ない場合は、literal-result要素を使用します。

リテラル結果要素を使用する主な利点は、-と比較して読みやすさと可動部分が少ないことです。xsl:elementこれは、エラーが発生しにくいことを意味します。

于 2012-09-25T02:48:05.197 に答える