2014-03-27 56 views
0

我已創建了一個模板whic是這樣的:在XSLT文件調用模板

<xsl:template name="loop"> 
    <xsl:param name="yeni"></xsl:param> 
      <xsl:choose> 
      <xsl:when test="$yeni !=''"> 
      <span style="color:#ff0000"> 
       <br/> 
       <xsl:value-of select="$yeni"/> 
       </span> 
        <xsl:call-template name="loop"> 

        <xsl:with-param name="yeni" select="substring($yeni,2)"/> 
        </xsl:call-template> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:text>I am out of the loop</xsl:text> 
       </xsl:otherwise> 
       </xsl:choose> 
</xsl:template> 

我可以打電話的地方它和它works.But我想從這個代碼XSLT的設計打破了調用它。爲什麼我不能在<xsl:template match="//n1:Invoice/cac:InvoiceLine">調用這個模板

<xsl:template match="//n1:Invoice/cac:InvoiceLine"> 
<tr> 
<td id="lineTableTd" align="right"> 
<xsl:template match="/"> 
          <xsl:call-template name="loop"> 
          <xsl:with-param name="yeni">"hello"</xsl:with-param> 
          </xsl:call-template> 
         </xsl:template> 
</td> 
</tr> 
+1

你不能在''內部有一個''。你想做什麼? – Tomalak

+0

我有xml文件哪些標籤在Invoice tag.i循環這個標籤與這個模板 .And Invoice/InvoiceLine中的一個標籤具有像這樣的值aaa !bbb!ccc!.i必須循環這個值並根據!解析它。我嘗試這個循環 – altandogan

+0

正如Tomalak所說,問題是**沒有**調用命名模板。由於它位於另一個模板(匹配'// n1:Invoice/cac:InvoiceLine')內,因此它是周圍的模板'',它會破壞您的代碼。這是不允許的。刪除周圍的模板,它會起作用(假設你的循環模板確實工作)。 –

回答

2

如果你看看你當前的代碼......

<xsl:template match="//n1:Invoice/cac:InvoiceLine"> 
    <tr> 
     <td id="lineTableTd" align="right"> 
     <xsl:template match="/"> 
      <xsl:call-template name="loop"> 
       <xsl:with-param name="yeni">"hello"</xsl:with-param> 
       </xsl:call-template> 
     </xsl:template> 
    </td> 
    </tr> 
</xsl:template> 

你有一個XSL的問題:其他XSL內模板巢:模板這是不允許的。它應該是這樣的

<xsl:template match="n1:Invoice/cac:InvoiceLine"> 
    <tr> 
     <td id="lineTableTd" align="right"> 
     <xsl:call-template name="loop"> 
      <xsl:with-param name="yeni">"hello"</xsl:with-param> 
     </xsl:call-template> 
    </td> 
    </tr> 
</xsl:template> 

(請注意,你不也需要//在模板比賽開始要麼)

這會給你下面的輸出雖然

<span style="color:#ff0000"><br/>"hello"</span> 
<span style="color:#ff0000"><br/>hello"</span> 
<span style="color:#ff0000"><br/>ello"</span> 
<span style="color:#ff0000"><br/>llo"</span> 
<span style="color:#ff0000"><br/>lo"</span> 
<span style="color:#ff0000"><br/>o"</span> 
<span style="color:#ff0000"><br/>"</span> 
I am out of the loop 

可能需要將「循環」模板中的<xsl:value-of select="$yeni"/>更改爲<xsl:value-of select="substring($yeni, 1, 1)"/>。也有可能你實際上並不需要引號圍繞「你好」在這種情況下

<xsl:with-param name="yeni">hello</xsl:with-param> 

你只需要引號,如果你做了這種方式(來阻止它尋找一個名爲「元素你好「)。

<xsl:with-param name="yeni" select='"hello"' /> 

另外,如果您希望按特定字符串拆分某些文本,則可以使用類似的方法。您可以使用「contains」函數來檢查一個字符串是否包含另一個字符串。如果是這樣,你將使用「substring-before」輸出第一位,然後使用「substring-after」遞歸調用「循環」模板。

+0

謝謝你太多了.. – altandogan