XSL中使用substring的copy-of函数

3

我有一个在XSL中使用的函数,是从这篇帖子中取得的。

它可以将“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"/>

我错在哪里了?

(关于IT技术的问题)
2个回答

2
你需要使用xsl:value-of而不是xsl:copy-ofxsl:copy-of会返回所选标签的元素及其所有值。 xsl:value-of会返回与所选标签相关联的文本。因为你想要获取子字符串,所以你需要文本。

$breakText 可能指向一个元素。你可以在一个元素上使用 copy-of。但是你不能在一个元素上使用 substring,只能使用它的文本,而且你肯定不能在结果字符串上使用 copy-of - yamen
在替换子字符串和完整字符串之后,如何显示所需文本? - roy.d

0

这个问题中使用的解决方案恰好是我的。

它将换行符而不是用"line-break"替换为<br />元素。元素是一个节点--而不是一个字符串。

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

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

substring($breakText,0,550)

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

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

另一方面

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

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

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


@roy.d:请编辑问题并提供一个完整的(但尽可能小的)XML文档示例,XSLT转换以及您获得的结果,以便人们可以重现该问题——然后许多人将能够解释导致不必要输出的原因并提供正确的解决方案。 - Dimitre Novatchev
我编辑了我遇到的问题,XML 不是问题的原因。同时,我使用如上所述的函数将 \r\n 转换为 <br>。 - roy.d
@roy.d:我相应地编辑了我的答案,解释了复制节点集和仅将其转换为字符串之间的区别。这就是你问题的原因。 - Dimitre Novatchev
为了解决这个问题,我调用带有子字符串文本参数的函数。 - roy.d
@roy.d:我很高兴我的回答对你有帮助。 - Dimitre Novatchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接