XSLT 在基于属性的另一个模板中应用模板
XSLT Apply template inside an another template based on Attribute
我有下面的 XML,我必须循环遍历 Test_resuts 和 Component。当组件的类型与特定名称匹配时,我必须对该组件应用不同的模板。我已经为每个组件类型 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
中的上下文节点是 Component
,xsl: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">
我有下面的 XML,我必须循环遍历 Test_resuts 和 Component。当组件的类型与特定名称匹配时,我必须对该组件应用不同的模板。我已经为每个组件类型 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
中的上下文节点是 Component
,xsl: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">