xslt应用模板并匹配

时间:2012-02-28 00:36:40

标签: xml xslt

这不是我的代码。但它模仿我想要的那就是为什么我在这里使用它。我从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>

2 个答案:

答案 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存在则显示它”。