Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 根据参数应用不同的XSLT模板_Asp.net_Xslt - Fatal编程技术网

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

我有什么?

我有一个ASP.NET项目,其中有一个XSLT文件,其中定义了许多模板。根据用户在网页上显示内容的选择,一次只能使用一个模板。它看起来像这样:

    <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会议演示文稿(我个人资料中的链接)。