我在 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 个字符)显示文本,就像我没有使用"插入中断"功能一样
<xsl:copy-of select="substring($breakText,0,550)"/>
但是长描述的这一行工作正常:
<xsl:copy-of select="$breakText"/>
我错在哪里?
你想使用xsl:value-of
而不是xsl:copy-of
。 xsl:copy-of
返回所选标记的元素及其所有值。 xsl:value-of
返回与所选标记关联的文本。由于您正在尝试获取子字符串,因此您需要文本。
问题中使用的解决方案恰好是我的。
它不是用"换行符"而是用<br />
元素替换换行符。元素是一个节点 - 而不是一个字符串。
因此,本问题中定义的$breakText
是临时树(在 XSLT 2.0 中)或 RTF(结果树片段)在 XSLT 1.0 中,而不是字符串。
问题是(不管使用零作为索引的伴随小错误):
substring($breakText,0,550)
是一个字符串(根据字符串值 $breakText
计算),因此不能包含任何<br/>
元素或任何节点
请记住:元素或树的字符串值是其所有文本节点后代的值的串联。
另一边:
<xsl:copy-of select="$breakText"/>
复制临时树(在 XSLT 2.0 中)或生成 RTF 的序列化(在 XSLT 1.0 中)。
更简单地说,xsl:copy-of
保留结构,string()
或任何字符串转换只会生成一个字符串 - 而字符串没有结构(所有节点都消失了)。