2011-06-10 20 views
2

XML:は同じレベルで、同じXML要素のための異なるテンプレートをレンダリング

<Root> 
    <Elements> 
    <Element>el1</Element> 
    <Element>el2</Element> 
    </Elements> 

    <Elements> 
    <Element>el1</Element> 
    <Element>el2</Element> 
    </Elements> 
</Root> 

が同じ要素のための2つの異なるテンプレートを適用するために生成しよう。

メインテンプレート:

<xsl:stylesheet version="1.0"> 
     <xsl:template match="/Root"> 
      At root level 
      <xsl:apply-templates select="Elements"> 

      <h1>Render something more</h1> 

      <xsl:apply-templates select="Elements" mode="1:Custom"> 
     </xsl:template> 


    <!-- This doesn't render though it is called above--> 
     <xsl:template match="Elements"> 
     render something here 
     </xsl:template> 

    <!-- This renders twice --> 
     <xsl:template match="Elements" mode="1:Custom"> 
     render something else here 
     </xsl:template> 
</xsl:stylesheet> 

私は最初のテンプレートにモードを追加した場合、両方がレンダリングされません。

も試み:異なるテンプレートと

<xsl:apply-templates select="Elements" mode="1:Custom" /> 

として適用する:

<xsl:apply-templates select="Elements" mode="Different" /> 

2つだけ(レンダリングされた指定されたモードを持つ最初のもの)のいずれか。すなわち

<xsl:template match="Elements"> 
</xsl:template> 

または <xsl:template match="Elements" mode="Different" />が二度レンダリングレンダリングされません。

これはどのように修正する必要がありますか?私が研究したどこでも、それはモードを優先することを提案します。多くのプログラマーがそれを使用しているので、単純なものでなければなりませんか?

+2

これは、あなたのXSLTプログラムの残りの部分を見ずにはお答えできません。どこかでかなり単純な間違いがありますが、文脈でそれを指摘するだけでは不十分です。それでもあなたのために失敗したXSLT/XMLペアを生成し、質問に追加してください。 – Tomalak

+0

あなたが説明したことは、lecitであり、うまくいくはずです。 XSLTをもう少し詳しく見せてください。 –

+0

私は今質問を編集しました。それは少し明確になることを望みますか? –

答えて

5
<?xml version="1.0"?> 

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

     <xsl:template match="/Root"> 
      At root level 
      <xsl:apply-templates select="Elements"/> 

      <h1>After first template</h1> 

      <xsl:apply-templates select="Elements" mode="Custom"/> 
     </xsl:template> 

     <xsl:template match="Elements"> 
     <p>First template</p> 
      <xsl:apply-templates select="Element"/> 
     </xsl:template> 

     <xsl:template match="Elements" mode="Custom"> 
     <p>Second template  </p> 
     </xsl:template> 
     </xsl:stylesheet> 
4
<xsl:template match="Elements" mode="1:Custom"> 

あなたはここにsyntactically illegal mode nameを使用している(QNameでなければならない)とすべての準拠したXSLTプロセッサはエラーを発行しなければなりません。

ソリューション

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/Root"> 
     At root level 
    <xsl:apply-templates select="Elements"/> 
    <h1>Render something more</h1> 

    <xsl:apply-templates select="Elements" mode="Custom"/> 
    </xsl:template> 

    <xsl:template match="Elements"> 
     render something here 

    </xsl:template> 

    <xsl:template match="Elements" mode="Custom"> 

    render something else here 
    </xsl:template> 

    <xsl:template match="text()"/> 
</xsl:stylesheet> 

WH:ちょうどそのため、この変換が正しいある

mode="Custom" 

mode="1:Custom" 

を変更ENが提供されるXML文書に適用:

<Root> 
    <Elements> 
     <Element>el1</Element> 
     <Element>el2</Element> 
    </Elements> 
    <Elements> 
     <Element>el1</Element> 
     <Element>el2</Element> 
    </Elements> 
</Root> 

指名手配、正しい結果が生成されます。

 At root level 

    render something here 


    render something here 

<h1>Render something more</h1> 

render something else here 


render something else here 
関連する問題