这不是我的代码。但它模仿我想要的那就是为什么我在这里使用它。我从here
得到了这个<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 :(得分: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。 XSLT 2.0中的xsl:function
使用xsl:function
- 用XSLT编写的函数 - 可以实现您想要的功能 - 此功能仅在XSLT 2.0(及更高版本)中可用。完全可以编写相同函数的不同重载,我们有很多例子。
答案 1 :(得分:0)
您的两个模板主要区别在于“如果已提供标题,则显示它”。为此,您可以将参数默认设置为空序列(在XSLT 2.0中,将select="()"
添加到xsl:param或1.0,select="/.."
),并将条件逻辑添加到模板表格“如果$ title存在则显示它”。