2012-04-26 13 views
1

私は現在、ほとんどがHTMLを表す単純なマークアップを持っています。以下は 子ノードを表示

は、しかし、私は問題を抱えている、私はもちろん <b>タグが通過し、自動的に太字で表示されていることを確認するために <xsl:copy-of>を使用することができる

<li>Make this <b>Bold</b></li> 

の抜粋です。

マークアップをキーワードやフレーズのリポジトリに対してチェックする別のXSLを使用しています。存在する場合は、リンクが作成されます。

以下はしかし、私はこの問題を回避することができますどのようにわからないようにしています、このメソッドはを通過するすべての子タグを防止

<xsl:template name="List" match="li"> 
    <li> 
      <xsl:call-template name="markup"> 
      <xsl:with-param name="text" select="."/> 
      <xsl:with-param name="phrases" select="document('../../documents/main/keywords.xml')/keywords/keyword"/> 
      <xsl:with-param name="first-only" select="false()"/> 
      </xsl:call-template> 
    </li> 
    </xsl:template> 

私のXSLです。

ご協力いただきありがとうございます。 Dan

+0

_markup_のテンプレートに関する詳細を教えてください。現在、_li_要素の子要素が失われる理由はありません。 _li_要素全体をテンプレートに渡すので( '')、すべての子孫がテンプレート内で使用可能になるはずです。 – Martin

+0

http://www.jenitennison.comから入手可能なmarkup.xslを使用しています。基本的に、markup.xslはキーワードのリポジトリ(keywords.xml)を調べ、表示されているドキュメントと比較します。一致すると、次のコードが使用されます。 \tます。 \t \t

+0

http://www.jenitennison.com/xslt/utilities/markup.xml –

答えて

1

問題は、リンク作成テンプレートが間違ったことをすることです。

正しいことはで、IDテンプレートを使用し、<li>のテキストノード子孫用の専用テンプレートを作成することです。アイデンティティーテンプレートが正常にこのような問題を解決するための鍵である

<xsl:variable 
    name="keywords" 
    select="document('../../documents/main/keywords.xml')/keywords/keyword" 
/> 

<!-- the identity template does copies of everything not matched otherwise --> 
<xsl:template match="node() | @*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
</xsl:template> 

<!-- text nodes in <li> elements get special treatment --> 
<xsl:template match="li//text()"> 
    <xsl:call-template name="markup"> 
    <xsl:with-param name="phrases" select="$keywords"/> 
    <xsl:with-param name="first-only" select="false()"/> 
    </xsl:call-template> 
</xsl:template> 

<!-- marks up the current node --> 
<xsl:template name="markup"> 
    <xsl:with-param name="phrases" /> 
    <xsl:with-param name="first-only" select="true()" /> 

    <!-- you can use . here - no need to pass in a $text param --> 
</xsl:template> 

はこれを試してみてください。 <li><b>を透過的にコピーします。

  1. より具体的なテンプレートが現在のノードに一致しない限り、入力を完全に走査してコピーします。
  2. これは、に変更するノードのテンプレートを書き込む必要があることを意味します。。この場合、のテキストノードと一致するのは、ネストされた子を持つことができないためです。
  3. <xsl:template name="List">のような名前付きテンプレートは使用しないでください。これは「プッシュスタイル」のXSLTです。つまり、必須であり、しばしばかなり不器用な結果につながります。
  4. <xsl:template match="li//text()">は、ストリームの外にノードをプルし、単にコピーするよりも複雑です。これは「プルスタイル」のXSLT、つまりテンプレートマッチングです。通常、処理しやすく、よりクリーンなXSLTコードを生成します。
  5. もちろん、<li>個の要素内のテキストノードには制約されません。他のノードに影響を与えるように一致式を変更するだけです。

他のテンプレートを中断することなく、すべての<b>ノードを<strong>に変えたいとします。プルスタイルで、これはこのように簡単です:

<xsl:template match="b"> 
    <strong> 
    <xsl:apply-templates select="node() | @*" /> 
    <strong> 
</xsl:template> 

はまた、あなたが<xsl:call-template>を行う際現在のノードが変化しないことに注意してください。したがって、現在のノードを呼び出されたテンプレートに渡す必要はありません。

+0

ますスター!どうもありがとうございます。 –

+0

@Danielよろしくお願いします。 – Tomalak

関連する問題