2015-01-07 79 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">