2010-10-29 92 views
0

我在使用XSL時遇到了一些問題:當使用apply-templates打印子模板時,是否可以使用另一模板?我不想使用當前節點,但確實創建了一個與模板匹配的新元素。XSL在另一個模板中使用特定模板

的例子就是我尋找:

XML文件:

<root> 
    <toto name="foo"> 
    <b>hello</b> 
    </toto> 
</root> 

XSL樣式表:

<xsl:template match="/"> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="tata" name="tata"> 
    <div class="tata"> 
    <xsl:apply-templates /> 
    </div> 
</xsl:template> 

<xsl:template match="toto" name="toto"> 
    <tata> 
    <xsl:value-of select="@name" /> 
    </tata> 
    <tata> 
    <xsl:apply-templates /> 
    </tata> 
</xsl:template> 

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

預期輸出:

<div class="tata">foo</div> 
<div class="tata"> 
    <b>hello</b> 
</div> 

回答

2

如果我理解你正確地你正在尋找的

<xsl:call-template name="tata" /> 

元素。

+0

但是,如何將節點內容傳遞給tata?如果我看到的是正確的,只能使用wsl:with-param,而我不知道如何使用它將節點傳遞給第二個模板的xsl:apply-templates。 – Arcanis 2010-10-29 07:50:42

0

有沒有必要調用您的問題中的其他模板。實際上,您可以在template match="toto"中執行幾乎所有必需的處理。實際上,在您的示例代碼中,從不使用<xsl:template match="tata">(使用該輸入XML)。在模板中創建文字元素不會導致調用與該元素匹配的其他模板。

這個樣式表

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

    <xsl:output encoding="UTF-8" indent="yes"/> 

    <xsl:template match="root"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="toto"> 
     <div class="tata"> 
      <xsl:value-of select="@name"/> 
     </div> 
     <div class="tata"> 
      <xsl:apply-templates/> 
     </div> 
    </xsl:template> 

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

</xsl:stylesheet> 

與該輸入

<root> 
    <toto name="foo"> 
    <b>hello</b> 
    </toto> 
</root> 

產生所需的結果

<?xml version="1.0" encoding="UTF-8"?> 
<div class="tata">foo</div> 
<div class="tata"> 
<b>hello</b> 
</div> 

像丹尼斯回答,如果你想使用模板從一個又一個,使用<xsl:call-template/>元素。如果您還想更改當前節點(上下文節點),則可以使用

<xsl:apply-templates select="path/to/new/context"/> 
+0

+1很好的答案。 – 2010-10-29 14:38:11

+0

我的代碼是一個最小的展示。在真正的模板中,「tata」模板不是一個單獨的div,因此爲此複製這樣的代碼並不是很美妙。而apply-templates似乎只適用於XML子節點,而不是XSL創建的(或者我不知道該怎麼做)。 – Arcanis 2010-10-30 13:15:29

相關問題