Asp.net 根据参数应用不同的XSLT模板
我有什么? 我有一个ASP.NET项目,其中有一个XSLT文件,其中定义了许多模板。根据用户在网页上显示内容的选择,一次只能使用一个模板。它看起来像这样:Asp.net 根据参数应用不同的XSLT模板,asp.net,xslt,Asp.net,Xslt,我有什么? 我有一个ASP.NET项目,其中有一个XSLT文件,其中定义了许多模板。根据用户在网页上显示内容的选择,一次只能使用一个模板。它看起来像这样: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="TemplateName"></xsl:param> <xsl:templ
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="TemplateName"></xsl:param>
<xsl:template match="Title_Only">
...template Title_Only body...
</xsl:template>
<xsl:template match="Image_Only">
...template Image_Only body...
</xsl:template>
<xsl:template match="Title_And_Image">
...template Title_And_Image body...
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="TemplateName"/>
<xsl:template match="/">
<xsl:apply templates select="something[some_condition=$TemplateName]"/>
</xsl:template>
</xsl:stylesheet>
…模板标题\u仅正文。。。
…模板图像\u仅正文。。。
…模板标题和图像正文。。。
我想要什么?
我希望将模板名TemplateName
作为参数传递,并能够在数据上应用相应的模板
有人能告诉我如何实现这一点吗?在XSLT 1.0中,不能在匹配模式中使用参数或变量的值。但是,您可以从单个模板有条件地应用模板,如下所示:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="TemplateName"></xsl:param>
<xsl:template match="Title_Only">
...template Title_Only body...
</xsl:template>
<xsl:template match="Image_Only">
...template Image_Only body...
</xsl:template>
<xsl:template match="Title_And_Image">
...template Title_And_Image body...
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="TemplateName"/>
<xsl:template match="/">
<xsl:apply templates select="something[some_condition=$TemplateName]"/>
</xsl:template>
</xsl:stylesheet>
应用于此输入:
<test>
<val name="Title_Only" />
<val name="Image_Only" />
<val name="Title_And_Image" />
</test>
…基于$TemplateName
的值。(请注意,本例使用了一个变量,但其思想是相同的。)
使用模式分离模板
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="TemplateName" select="'Title_Only'" />
<xsl:template match="/">
<xsl:apply-templates select="test/val[@name=$TemplateName]" />
</xsl:template>
<xsl:template match="val">
<xsl:value-of select="@name" />
</xsl:template>
</xsl:stylesheet>
如果您确实需要在每种情况下使用完全不同的模板,那么请使用模式。此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="TemplateName" select="'Title_Only'" />
<xsl:template match="/">
<xsl:choose>
<xsl:when test="$TemplateName='Title_Only'">
<xsl:apply-templates select="test/val" mode="Title_Only" />
</xsl:when>
<xsl:when test="$TemplateName='Image_Only'">
<xsl:apply-templates select="test/val" mode="Image_Only" />
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="test/val" mode="Title_And_Image" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="val" mode="Title_Only">
<xsl:value-of select="@title" />
</xsl:template>
<xsl:template match="val" mode="Image_Only">
<xsl:value-of select="@img" />
</xsl:template>
<xsl:template match="val" mode="Title_And_Image">
<xsl:value-of select="@title" />/
<xsl:value-of select="@img" />
</xsl:template>
</xsl:stylesheet>
根据参数的值使用所需的模板
我想传递模板名
TemplateName作为一个参数,并且要
可以在上应用相应的模板
数据
在XSLT 1.0和XSLT 2.0中,像这样的构造是非法的:
<xsl:call-template name="{$vTemplateName}"/>
55
当应用于上述XML文档时,将生成所需的正确结果:
<xsl:call-template name="{$vTemplateName}"/>
55
当我们更换时:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
<xsl:param name="pOp" select="'sum'"/>
<xsl:param name="pOp" select="'concat'"/>
01020304050607080910
注意事项:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
<xsl:param name="pOp" select="'sum'"/>
<xsl:param name="pOp" select="'concat'"/>
01020304050607080910
主(使用)模板可以并且通常将位于单独的XSLT样式表文件中,并将使用实现操作的模板导入样式表。主模板不知道实现了哪些操作(并且不使用带有硬编码名称的
)
事实上,如果从导入的文件中添加或删除模板,则无需修改主(使用)模板。在这种编程风格中,
指令通常选择在生成主模板时尚未编写的执行模板。参与元素中的模式属性。使用参数可以实现这种动态模板应用。如果此值与输入源相关(甚至通过映射),则始终可以使用lwburk之类的推送样式。如果情况并非如此(输入源中的同一节点需要不同的规则,具体取决于参数),则可以使用条件指令、带内联数据甚至外部源的反向映射或命名模板引用(如FXSL)。好问题,+1。请参阅我的答案,了解完整且更通用的解决方案,这是成功模拟XSLT 1.0和XSLT 2.0中FXSL库中的高阶函数(HOF)的主要思想。您可能有兴趣了解实现HOFs的一种更通用、更强大的技术——请参阅我的答案。+1-我还没有看过FXSL,但这个例子让我非常惊讶interested@lwburk:在这种情况下,我建议您直接阅读FXSL2会议演示文稿(我个人资料中的链接)。