I.Это исправимая ошибка - иметь два шаблона с одинаковым шаблоном соответствия - в лучшем случае для выполнения будет выбран только один из них .
В вашем конкретном примере вы можете использовать только шаблонс параметром и слегка измените его код, чтобы, когда параметр не имел значения (пустая строка), заголовок не записывался.
Вот небольшая демонстрация того, как это можно сделать :
<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
в XSLT 2.0
То, чего вы хотите, может быть достигнуто с помощью xsl:function
- функций, написанных на XSLT - эта функция доступна только в XSLT 2.0 (и выше).Вполне возможно написать разные перегрузки одной и той же функции, и у нас есть много примеров этого.