2012-02-28 78 views
2

这不是我的代码。但它模拟到我想要的那就是为什么我在这里使用它。我得到这个从herexslt应用模板和匹配

<xsl:template match="/"> 
<xsl:apply-templates select="event/details"> 
<xsl:with-param name="title" select="event/title"/> <!-- pass param "title" to matching templates --> 
</xsl:apply-templates> 
</xsl:template> 

<xsl:template match="details"> 
<xsl:param name="title"/> <!-- this template takes parameter "title" --> 
Title: <xsl:value-of select="$title"/><br/> 
Timestamp: <xsl:value-of select="java:DateUtil.getDate(number(timestamp))"/><br/> 
Description: <xsl:value-of select="description"/><br/> 
</xsl:template> 

我的问题是我能得到上述匹配模板“细节”与参数和一个不带参数?对不起,我的英语..我知道如果我没有意义,我会尽我所能来重写这个。先进的谢谢你。

编辑:这是我想要的。

template 1 - with parameter: 

<xsl:template match="details"> 
<xsl:param name="title"/> <!-- this template takes parameter "title" --> 
Title: <xsl:value-of select="$title"/><br/> 
Timestamp: <xsl:value-of select="java:DateUtil.getDate(number(timestamp))"/><br/> 
Description: <xsl:value-of select="description"/><br/> 
</xsl:template> 

template 2 - without parameter: 

<xsl:template match="/"> 
<xsl:apply-templates select="event/details"/> 
</xsl:template> 

<xsl:template match="details"> 
Timestamp: <xsl:value-of select="java:DateUtil.getDate(number(timestamp))"/><br/> 
Description: <xsl:value-of select="description"/><br/> 
</xsl:template> 
+0

你的意思并不完全清楚。您应该编辑您的帖子以包含样本输入XML和期望的输出。 – 2012-02-28 00:46:30

+0

我希望这会有道理..抱歉,我是xslt的新手。基本上我想在C#语言是带参数和不带参数的函数。所以我可以使用两个,当我有参数,当我不.. – AJP 2012-02-28 00:52:49

+0

根据参数的数量和/或类型在XSLT没有动态选择相同的模板(重载)。 – 2012-02-28 01:02:27

回答

0

一,它是可恢复的错误有两个模板使用相同的匹配模式 - 仅在其中的一个将被选择执行最好的情况下。

在您的具体示例中,您可以仅使用具有参数的模板并略微修改其代码,以便参数没有值时(空字符串),则不写入标题。

这里是一个小的示范了如何可以做到这一点

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="event/details"/> 
     =========== 
     <xsl:apply-templates select="event/details"> 
      <xsl:with-param name="title" select="'Title Provided'"/> 
     </xsl:apply-templates> 

    </xsl:template> 

    <xsl:template match="details"> 
     <xsl:param name="title"/> 

    <xsl:value-of select= 
    "concat(substring('Title: ', 
         1 + 7*not(string-length($title) > 0) 
        ), 
      $title) 
    "/> 
     <br/> Timestamp: 
     <xsl:value-of select="'someTimeStamp'"/> 
     <br/> Description: 
     <xsl:value-of select="description"/> 
     <br/> 
    </xsl:template> 

</xsl:stylesheet> 

在这个转变匹配details模板调用两次 - 第一次不带参数,并第二次用$title参数。在这两种情况下,模板生成所需的输出

<br/> Timestamp: 
     someTimeStamp<br/> Description: 
     <br/> 
     =========== 
     Title: Title Provided<br/> Timestamp: 
     someTimeStamp<br/> Description: 
     <br/> 

II。 xsl:function in XSLT 2.0

想要什么可以通过xsl:function实现 - 用XSLT编写的函数 - 此功能仅在XSLT 2.0(及更高版本)中可用。编写同一函数的不同重载是完全可能的,我们有很多这样的例子。

+0

谢谢你的回复..但在我的情况下,我想修改其他进程正在使用的现有xslt文件。我试图将参数添加到许多进程之一来输出一点不同。我试图避免修改其他进程。所以我想我将不得不重新写这种方法以其他方式..因为我不能重写这个..再次感谢你。 – AJP 2012-02-28 01:00:20

+0

@AJP:如果模板属于不同的*导入*样式表,则可以重写。请阅读'xsl:import'。或者,如果你有XSLT 2.0处理器,只需使用'xsl:function',正如我的答案更新所解释的那样,它可以有不同的重载。 – 2012-02-28 01:12:43

+0

谢谢..我想我会写新的模板,因为我的要求是有点不同。但我确实从中得到了一些知识......真正明白你的时间和帮助。 – AJP 2012-02-28 01:15:56

0

您的两个模板的区别主要在于“如果标题已经提供然后显示”。为了达到这个目的,你可以使参数默认为一个空序列(在XSLT 2.0中,将select="()"添加到xsl:param中,或者在1.0,select="/.."中),然后将条件逻辑添加到形如“if $ title exists”的模板中显示它“。