XSLT调用HTML内部的模板

时间:2017-02-10 17:24:08

标签: html xml xslt xslt-1.0

如果有人愿意告诉我为什么以下<xsl:call-template name="Log">无法工作?

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<TextMessages>
  <Message>[Step]</Message>
  <Message>Step ID: 1</Message>
  <Message>Description</Message>
</TextMessages>

XSLT文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/"> 
<html> 
   <body>
     <h2>My CD Collection &gt;</h2>
     <p>
       <xsl:call-template name="Log">
       </xsl:call-template>
     </p>
   </body>
</html>
</xsl:template>

<xsl:template name ="Log">
    <xsl:variable name="break">&lt;br/&gt;</xsl:variable>
    <xsl:for-each select="TextMessages">
      <p>
        <xsl:value-of select="."/>
        <xsl:value-of select="$break"/>
      </p>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

想要的输出:

My CD Collection >
[Step]<br/>
Step ID: 1<br/>
Description<br/>

真正的问题还有参数,我用参数调用,但不确定这是否是问题。

<p>
  <xsl:call-template name="Log">
    <xsl:with-param name="testId" select="@testId" /> 
  </xsl:call-template>
</p>

<xsl:template name ="Log">
    <xsl:param name="testId" />
    <xsl:variable name="break">&lt;br/&gt;</xsl:variable>
    <xsl:for-each select="/t:TestRun/t:Results/t:UnitTestResult[@testId=$testId]/t:Output/t:TextMessages/t:Message">
      <p>
        <xsl:value-of select="."/>
        <xsl:value-of select="$break"/>
      </p>
    </xsl:for-each>
  </xsl:template>

2 个答案:

答案 0 :(得分:0)

添加行

<xsl:stylesheet... >
My CD Collection > [Step] Step ID: 1 Description 行之后直接

到你的XSLT文件,你将得到(部分期望的)

的结果
<h2>My CD Collection &gt;</h2>

对于“部分”,我确实引用了第一行 - 您明确希望通过在XSLT中包含$this->Auth->unauthorizedRedirect = false,来输出 - 但在输出文本中没有提及。

答案 1 :(得分:0)

如果我猜对了,你想改变:

<xsl:template name ="Log">
    <xsl:variable name="break">&lt;br/&gt;</xsl:variable>
    <xsl:for-each select="TextMessages">
      <p>
        <xsl:value-of select="."/>
        <xsl:value-of select="$break"/>
      </p>
    </xsl:for-each>
</xsl:template>

为:

<xsl:template name="Log">
    <xsl:for-each select="TextMessages/Message">
        <p>
            <xsl:value-of select="."/>
        </p>
        <hr/>
    </xsl:for-each>
</xsl:template>

注意:

  1. 您永远不必使用像&lt;br/&gt;这样的黑客来输出HTML或XML有效标记;

  2. 我不确定您为什么需要在此处调用命名模板,而不是仅在第一个模板中包含xsl:for-each,或者只是将模板应用于Message元素。