xsl copy-of with substring

时间:2012-04-16 09:50:18

标签: xslt xslt-1.0

我在xsl中有这个功能,我从这个post

将“cr”替换为“line-break”

这就是我所说的:

<xsl:variable name="breakText">
     <xsl:call-template name="insertBreaks"> 
          <xsl:with-param name="subject" select="PublicProfile/AboutMe"/> 
         </xsl:call-template>
    </xsl:variable>

我喜欢文章链接到“阅读更多”文字点击 文章的短暂开头的第一个div(长篇文章的550个字符) 显示文本,就像我没有使用“insertBreaks”函数

<xsl:copy-of select="substring($breakText,0,550)"/>

但长篇描述的这一行工作正常:

<xsl:copy-of select="$breakText"/>

我哪里错了?

2 个答案:

答案 0 :(得分:2)

您想使用xsl:value-of而不是xsl:copy-ofxsl:copy-of返回所选标记的元素及其所有值。 xsl:value-of返回与所选标记关联的文本。由于您正在尝试获取子字符串,因此您需要文本。

答案 1 :(得分:0)

问题中提到的解决方案恰好是我的。

它使用“换行符”替换换行符 not ,但使用<br /> 元素替换。元素是节点 - 而不是字符串。

因此,此问题中定义的$breakText是XSLT 1.0中的临时树(在XSLT 2.0中)或RTF(结果树片段) - 不是字符串。< / p>

问题在于(无论是否使用零作为索引的小错误):

substring($breakText,0,550)

是一个字符串(根据$breakText字符串值计算),因此不能包含任何<br/>元素或任何节点

记住:元素或树的字符串值是其所有文本节点后代的值的串联。

另一方

<xsl:copy-of select="$breakText"/> 

复制临时树(在XSLT 2.0中)或生成RTF的序列化(在XSLT 1.0中)。

更简单地说,xsl:copy-of 保留结构,string()或任何转换为​​字符串只会产生一个字符串 - 而字符串没有结构(所有节点消失了。)