3

我从这篇文章中获取的 xsl 中有这个功能

用“换行符”替换“cr”

这就是我所说的:

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

我哪里错了?

4

2 回答 2

2

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

于 2012-04-16T09:53:15.757 回答
0

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

它不是用“换行符”而是用<br /> 元素替换换行符。一个元素是一个节点——而不是一个字符串。

因此,$breakText在这个问题中定义的是临时树(在 XSLT 2.0 中)或 XSLT 1.0 中的 RTF(结果树片段)——而不是字符串。

问题是(不管使用零作为索引的附带小错误):

substring($breakText,0,550)

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

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

另一方面

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

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

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

于 2012-04-16T12:19:40.213 回答