2015-01-07 80 views
0

我有一个下面的XML,我必须循环通过Test_resuts组件。当一个组件的TYPE与特定名称匹配时,我必须将不同的模板应用到该组件。我已经为每个组件类型创建了一个XSL以及不同的模板,例如:NORMALTEXTBOX。但模板没有得到应用组件块 ......任何人都可以帮我在这里?XSLT根据属性在另一个模板中应用模板

XML

<Report> 
<Test_Results> 
    <Test_Result TestID="1" TestName="sampleTest" > 
     <Component Type="NORMALTEXTBOX"> 
     <ComponentName>Component1</ComponentName> 
     <ComponentId></ComponentId> 
     <Method></Method> 
     <Results></Results> 
     </Component> 
     <Component Type="NUMERICTEXTBOX"> 
     <ComponentName>Component2</ComponentName> 
     <ComponentId></ComponentId> 
     <Method></Method> 
     <Results></Results> 
     </Component> 
    </Test_Result> 

    <Test_Result TestID="1" TestName=""> 
     <Component Type="NORMALTEXTBOX"> 
     <ComponentName></ComponentName> 
     <ComponentId></ComponentId> 
     <Method></Method> 
     <Results></Results> 
     </Component> 
    </Test_Result> 
</Test_Results> 
</Report> 

XSL

  <?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" omit-xml-declaration="yes"/> 
     <xsl:template match="/"> 
      <html> 
      <body> 
      <xsl:apply-templates select="Report/Test_Results"/> 
      </body> 
      </html> 
     </xsl:template> 

     <xsl:template match="Test_Results"> 
      <xsl:for-each select="Test_Result"> 
      <xsl:for-each select="Component"> 
       <xsl:choose> 
        <xsl:when test="@Type = 'NORMALTEXTBOX'"> 
        <xsl:apply-templates select="Component" mode="normaltext"/> 
        </xsl:when> 

        <xsl:when test="@Type = 'NUMERICTEXTBOX'"> 
        <xsl:apply-templates select="Component" mode="numerictext"/> 
        </xsl:when> 
       </xsl:choose> 
      </xsl:for-each> 
      </xsl:for-each> 
     </xsl:template> 

     <xsl:template match="Component" mode="normaltext"> 
      <h1> different styles to be applied, only some values of component will be taken</h1> 
     </xsl:template> 

     <xsl:template match="Component" mode="numerictext"> 
      <h1>different styles to be applied, only some values of component will be taken</h1> 
     </xsl:template> 

    </xsl:stylesheet> 

回答

1

由于xsl:choose您的上下文节点是Componentxsl:apply-template的选择表达式应该是电流():

<xsl:choose> 
<xsl:when test="@Type = 'NORMALTEXTBOX'"> 
    <xsl:apply-templates select="." mode="normaltext"/> 
</xsl:when> 

<xsl:when test="@Type = 'NUMERICTEXTBOX'"> 
    <xsl:apply-templates select="." mode="numerictext"/> 
</xsl:when> 
</xsl:choose> 

但是,一更好的方法是只包含@Type条件如下模板匹配:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" omit-xml-declaration="yes"/> 
<xsl:template match="/"> 
    <html> 
     <body> 
      <xsl:apply-templates select="Report/Test_Results"/> 
     </body> 
    </html> 
</xsl:template> 
<xsl:template match="Test_Results"> 
    <xsl:for-each select="Test_Result"> 
     <xsl:apply-templates select="Component"/> 
    </xsl:for-each> 
</xsl:template> 
<xsl:template match="Component[@Type = 'NORMALTEXTBOX']"> 
    <h1> different styles to be applied, only some values of component will be taken</h1> 
</xsl:template> 
<xsl:template match="Component[@Type = 'NUMERICTEXTBOX']"> 
    <h1>different styles to be applied, only some values of component will be taken</h1> 
</xsl:template> 
</xsl:stylesheet> 
+0

感谢您的帮助。当我尝试使用时,它开始工作。我会尝试使用您提供的解决方案。谢谢 :) – Thavudu

0

我已经firgured出来...而不是应用模板,我曾尝试以下,并把它应用模板为purticular 组件

<xsl:call-template name="NORMALTEXTBOX">