XSLT 在基于属性的另一个模板中应用模板

XSLT Apply template inside an another template based on Attribute

我有下面的 XML,我必须循环遍历 Test_resutsComponent。当组件的类型与特定名称匹配时,我必须对该组件应用不同的模板。我已经为每个组件类型 eg:NORMALTEXTBOX 创建了一个具有不同模板的 XSL。但是模板没有应用到 组件块 ...有人可以帮我吗?

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>

由于 xsl:choose 中的上下文节点是 Componentxsl:apply-template 的 select 表达式应该是 current():

<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>

我已经弄清楚了...而不是 apply-templates,我尝试了下面的方法,它为那个 purticular component.

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