我有以下代码:
<xsl:variable name="landlord"><xsl:value-of select="agreement/landlord1name"/></xsl:variable>
<xsl:variable name="tenant"><xsl:value-of select="agreement/tenantname"/></xsl:variable>
<xsl:variable name="property"><xsl:value-of select="agreement/propertyname"/></xsl:variable>
<xsl:variable name="startdate"><xsl:value-of select="agreement/startdate"/></xsl:variable>
<xsl:variable name="period"><xsl:value-of select="agreement/agreementterm"/></xsl:variable>
<xsl:variable name="lbody">
<xsl:call-template name="replace-text-multi">
<xsl:with-param name="text" select="tatemplate/letterbody"/>
<xsl:with-param name="replaces" select="'#tenant #period'"/>
<xsl:with-param name="bys" select="$tenant"/>
<xsl:with-param name="delim" select="' '"/>
</xsl:call-template>
</xsl:variable>
这是模板名称=替换文字的代码:
<xsl:template name='replace-text'>
<xsl:param name='text'/>
<xsl:param name='replace'/>
<xsl:param name='by'/>
<xsl:choose>
<xsl:when test='contains($text, $replace)'>
<xsl:value-of select='substring-before($text, $replace)'/>
<xsl:value-of select='$by' disable-output-escaping='yes'/>
<xsl:call-template name='replace-text'>
<xsl:with-param name='text' select='substring-after($text, $replace)'/>
<xsl:with-param name='replace' select='$replace'/>
<xsl:with-param name='by' select='$by'/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select='$text'/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
这是模板名称= replace-text-multi:
的代码<xsl:template name="replace-text-multi">
<xsl:param name="text"/>
<xsl:param name="replaces"/>
<xsl:param name="bys"/>
<xsl:param name="delim"/>
<xsl:choose>
<xsl:when test="contains($replaces, $delim)">
<xsl:variable name="textSoFar">
<xsl:call-template name="replace-text-multi">
<xsl:with-param name="text" select="$text"/>
<xsl:with-param name="replaces" select="substring-after($replaces, $delim)"/>
<xsl:with-param name="bys" select="substring-after($bys, $delim)"/>
<xsl:with-param name="delim" select="$delim"/>
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="replace-text">
<xsl:with-param name="text" select="$textSoFar"/>
<xsl:with-param name="replace" select="substring-before($replaces, $delim)"/>
<xsl:with-param name="by" select="substring-before($bys, $delim)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="replace-text">
<xsl:with-param name="text" select="$text"/>
<xsl:with-param name="replace" select="$replaces"/>
<xsl:with-param name="by" select="$bys"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
这里我想将#tenant替换为$ tenant而将#period替换为$ period但是xsl无法读取select =“$ tenant $ period”。有人请帮忙
答案 0 :(得分:0)
我认为问题出在您的<xsl:when test="contains($replaces, $delim)">
状态。您需要先调用replace-text
,然后使用其余参数将其输出传递给replace-text-multi
模板。
<xsl:when test="contains($replaces, $delim)">
<xsl:variable name="textSoFar">
<xsl:call-template name="replace-text">
<xsl:with-param name="text" select="$text"/>
<xsl:with-param name="replace" select="substring-before($replaces, $delim)"/>
<xsl:with-param name="by" select="substring-before($bys, $delim)"/>
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="replace-text-multi">
<xsl:with-param name="text" select="$textSoFar"/>
<xsl:with-param name="replaces" select="substring-after($replaces, $delim)"/>
<xsl:with-param name="bys" select="substring-after($bys, $delim)"/>
<xsl:with-param name="delim" select="$delim"/>
</xsl:call-template>
</xsl:when>
除了空格之外,你的分隔符也可能是值得的,以防万一你的替换字符串中有空格。你还需要更改bys
的设置方式($delim
是包含所选分隔符的变量)
<xsl:with-param name="bys" select="concat($tenant, $delim, $period)"/>
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/root">
<xsl:variable name="tenant"><xsl:value-of select="agreement/tenantname"/></xsl:variable>
<xsl:variable name="period"><xsl:value-of select="agreement/agreementterm"/></xsl:variable>
<xsl:variable name="delim" select="'||'" />
<xsl:call-template name="replace-text-multi">
<xsl:with-param name="text" select="tatemplate/letterbody"/>
<xsl:with-param name="replaces" select="concat('#tenant', $delim, '#period')"/>
<xsl:with-param name="bys" select="concat($tenant, $delim, $period)"/>
<xsl:with-param name="delim" select="$delim"/>
</xsl:call-template>
</xsl:template>
<xsl:template name='replace-text'>
<xsl:param name='text'/>
<xsl:param name='replace'/>
<xsl:param name='by'/>
<xsl:choose>
<xsl:when test='contains($text, $replace)'>
<xsl:value-of select='substring-before($text, $replace)'/>
<xsl:value-of select='$by' disable-output-escaping='yes'/>
<xsl:call-template name='replace-text'>
<xsl:with-param name='text' select='substring-after($text, $replace)'/>
<xsl:with-param name='replace' select='$replace'/>
<xsl:with-param name='by' select='$by'/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select='$text'/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="replace-text-multi">
<xsl:param name="text"/>
<xsl:param name="replaces"/>
<xsl:param name="bys"/>
<xsl:param name="delim"/>
<xsl:choose>
<xsl:when test="contains($replaces, $delim)">
<xsl:variable name="textSoFar">
<xsl:call-template name="replace-text">
<xsl:with-param name="text" select="$text"/>
<xsl:with-param name="replace" select="substring-before($replaces, $delim)"/>
<xsl:with-param name="by" select="substring-before($bys, $delim)"/>
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="replace-text-multi">
<xsl:with-param name="text" select="$textSoFar"/>
<xsl:with-param name="replaces" select="substring-after($replaces, $delim)"/>
<xsl:with-param name="bys" select="substring-after($bys, $delim)"/>
<xsl:with-param name="delim" select="$delim"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="replace-text">
<xsl:with-param name="text" select="$text"/>
<xsl:with-param name="replace" select="$replaces"/>
<xsl:with-param name="by" select="$bys"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
应用于此XML
<root>
<agreement>
<tenantname>Tenant Name</tenantname>
<agreementterm>1st Dec to 2nd Dec</agreementterm>
</agreement>
<tatemplate>
<letterbody>
Dear #tenant
You term is #period
Kind regards
</letterbody>
</tatemplate>
</root>
以下是输出
Dear Tenant Name
You term is 1st Dec to 2nd Dec
Kind regards