3

SOまたは他の場所でこの質問に対する正確で単純な答えを見つけるのに苦労しました:

XSLファイルでは、どのテンプレートが最初、2番目などに処理されるかをどのように判断できますか?XPathがどれだけ具体的であるかによって順序付けられていることを読みました。さらに、XSL 1.0と2.0には違いがありますか?

最後に、これが私がいじっている欠陥のあるXSLファイルです。現在、出力は「目次」というタイトルだけです。ここにもXMLを添付します。

<xsl:template match="/">
    <h1>
        <xsl:text>Table of Contents</xsl:text>
    </h1>
</xsl:template>

<xsl:template match="heading1">
    <h2>
        <xsl:value-of select="."/>
    </h2>
</xsl:template>

<p>
    <xsl:text>This document contains </xsl:text>
    <xsl:value-of select="count(/article/body/heading1)"/>
    <xsl:text> chapters. </xsl:text>
</p>

およびXML:

<article>
<title>
    Creating output
</title>
<body>
    <heading1>Generating text</heading1>
    <heading1>Numbering things</heading1>
    <heading1>Formatting numbers</heading1>
    <heading1>Copying nodes from the input document to the output</heading1>
    <heading1>Handling whitespace</heading1>
</body> 

すべてのコンテンツが表示されない理由について何か説明はありますか?ご協力ありがとうございました!

4

1 に答える 1

5

何が起こっているのか:

  1. XSLTプロセッサは、XMLのルート要素を読み取ります
  2. 次に、スタイルシートを調べて、一致するものを確認します。最初のテンプレートが見つかります
  3. 最初のテンプレートを実行します。
  4. 最初のテンプレートはテキストを出力するように指示し、その後何もしないので、XSLTプロセッサは次の入力要素に移動します...しかし、ルートノード全体を処理したので、同じ入力ノードはもうありませんレベル。終わった。

あなたがする必要がある<xsl:apply-templates/>のは最初のテンプレートの中に置くことです。プロセッサがこれに遭遇すると、最初からやり直しますが、今回のコンテキストは、ルート内の第2レベルのノードのリストです。各XMLノードを順番に調べ、スタイルシートで最も一致するテンプレートを見つけて実行します。

これは重要な概念です。テンプレートは制御されておらず、手続き型でもありません。

于 2012-05-25T21:29:17.920 に答える