Is there any kind of a template "function of a node" in XSLT?
Here is the code I am using:
<xsl:template match="Row[position() = 1]">
<li style="width: 650px; float: left; list-style: none outside none;">
<ul class="liste1">
<xsl:if test="@Style='NewsCustomTemplate'">
<li>
开发者_开发问答 <div style="width:640px; color:#40494f; font-size:12">
<b style="color:black">
<xsl:value-of select="./@Title"/>
</b>
<xsl:choose>
<xsl:when test="string-length(./@Description)>300">
<xsl:value-of disable-output-escaping="yes" select="substring(./@Description,1,300)"/>...
</xsl:when>
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="./@Description"/>
</xsl:otherwise>
</xsl:choose>
</div>
<div>
<a class="" href="#" target="" title="">
read more
</a>
</div>
</li>
<xsl:if test="following-sibling::*[1]">
<li>
<div style="width:640px; color:#40494f; font-size:12">
<b style="color:black">
<xsl:value-of select="following-sibling::*[1]/@Title"/>
</b>
<xsl:choose>
<xsl:when test="string-length(following-sibling::*[1]/@Description)>300">
<xsl:value-of disable-output-escaping="yes" select="substring(following-sibling::*[1]/@Description,1,300)"/>...
</xsl:when>
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="following-sibling::*[1]/@Description"/>
</xsl:otherwise>
</xsl:choose>
</div>
<div>
<a class="" href="#" target="" title="">
read more
</a>
</div>
</li>
</xsl:if>
<xsl:if test="following-sibling::*[2]">
<li>
<div style="width:640px; color:#40494f; font-size:12">
<b style="color:black">
<xsl:value-of select="following-sibling::*[2]/@Title"/>
</b>
<xsl:choose>
<xsl:when test="string-length(following-sibling::*[2]/@Description)>300">
<xsl:value-of disable-output-escaping="yes" select="substring(following-sibling::*[2]/@Description,1,300)"/>...
</xsl:when>
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="following-sibling::*[2]/@Description"/>
</xsl:otherwise>
</xsl:choose>
</div>
<div>
<a class="" href="#" target="" title="">
read more
</a>
</div>
</li>
</xsl:if>
</xsl:if>
<xsl:if test="@Style='AgendaCustomTemplate'">
</xsl:if>
</ul>
</li>
</xsl:template>
The problem of my code is that I am reusing almost the exact same code three times:
- one for the current item "."
- one for the first sibling "following-sibling::*[1]"
- one for the second sibling "following-sibling::*[2]"
I would like to have sort of a generic template to perform this part for the node LOCATIONX:
<li>
<div style="width:640px; color:#40494f; font-size:12">
<b style="color:black">
<xsl:value-of select="LOCATIONX/@Title"/>
</b>
<xsl:choose>
<xsl:when test="string-length(LOCATIONX/@Description)>300">
<xsl:value-of disable-output-escaping="yes" select="substring(LOCATIONX/@Description,1,300)"/>...
</xsl:when>
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="LOCATIONX/@Description"/>
</xsl:otherwise>
</xsl:choose>
</div>
<div>
<a class="" href="#" target="" title="">
read more
</a>
</div>
</li>
Does anybody know if such a thing is possible in XSLT ? Or do I have to keep my code duplicated ?
Start by getting rid of that disable-output-escaping="yes". It was probably put in there as magic fairy-dust by someone who doesn't know what it means. Chances are it's not needed, in which case removing it does no harm; if the transformation doesn't work without it then there is something badly wrong with the design.
As for your question, put the common code inside
<xsl:template match="Row" mode="m">...</xsl:template>
and then do
<xsl:template match="Row[position()=1]">
<xsl:apply-templates select="." mode="m"/>
<xsl:apply-templates select="following-sibling::Row[1]" mode="m"/>
<xsl:apply-templates select="following-sibling::Row[2]" mode="m"/>
</xsl:template>
or more simply
<xsl:template match="Row[position()=1]">
<xsl:apply-templates select=".|following-sibling::Row[3 > position()]" mode="m"/>
</xsl:template>
精彩评论