在xslt文件中调用模板

时间:2014-03-27 08:07:19

标签: xml 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>  

我可以在某个地方调用它并且它可以工作。但是我想从这个代码中调用它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 个答案:

答案 0 :(得分: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:template 嵌套在另一个 xsl:template 中的问题,这是不允许的。它应该看起来像这样

<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

您可能需要更改&#34;循环中的<xsl:value-of select="$yeni"/>&#34;模板只有<xsl:value-of select="substring($yeni, 1, 1)"/>。也有可能你实际上并不需要引用标记&#34;你好&#34;在这个例子中

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

如果你这样做,你只需要引号(以阻止它寻找名为&#34的元素;你好&#34;)。

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

另外,如果您希望按特定字符串拆分某些文本,可以使用类似的方法。您可以使用&#34;包含&#34;用于检查字符串是否包含其他字符串的函数。如果是这样,你会使用&#34; substring-before&#34;输出第一位,然后递归调用&#34;循环&#34;模板使用&#34; substring-after&#34;。