Xslt 在<;xsl:param name=select>;xsl

Xslt 在<;xsl:param name=select>;xsl,xslt,Xslt,我有以下代码: <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="

我有以下代码:

<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>

这是template name=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”。有人请帮忙

我想问题出在你的
状况。您需要首先调用
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>
试试这个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>

向我们展示模板。我已经为模板添加了代码。可以肯定的是:当您说要将
#tenant
替换为
$tenant
时,您的意思当然是要用名为
tenant
的变量的值替换
'#tenant'
字符串?
<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>
<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