我有一个基本上是搜索应用程序的程序,它以VBScript和Perl形式存在(我试图用GUI创建可执行文件)。
目前,搜索应用程序会输出一个HTML文件,如果HTML中的一段文字超过十二行,那么它会隐藏任何内容,并包含一个可点击的More...
标记。
这是在XSLT中完成的,适用于VBScript。
我将样式表复制并粘贴到我正在使用的Perl程序中,除More...
标记外,它完成所有操作。
有什么理由可以使用VBScript而不是Perl吗?
我在Perl脚本中使用XML::LibXSLT
,这是应该创建More...
标记的模板
<xsl:template name="more">
<xsl:param name="text"/>
<xsl:param name="row-id"/>
<xsl:param name="cycle" select="1"/>
<xsl:choose>
<xsl:when test="($cycle > 12) and contains($text,' ')">
<span class="show" onclick="showID('SHOW{$row-id}');style.display = 'none';">More...</span>
<span class="hidden" id="SHOW{$row-id}">
<xsl:call-template name="highlight">
<xsl:with-param name="text" select="$text"/>
</xsl:call-template>
</span>
</xsl:when>
<xsl:when test="contains($text,' ')">
<xsl:call-template name="highlight">
<xsl:with-param name="text" select="substring-before($text,' ')"/>
</xsl:call-template>
<xsl:text> </xsl:text>
<xsl:call-template name="more">
<xsl:with-param name="text" select="substring-after($text,' ')"/>
<xsl:with-param name="row-id" select="$row-id"/>
<xsl:with-param name="cycle" select="$cycle + 1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="highlight">
<xsl:with-param name="text" select="$text"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
答案 0 :(得分:2)
我认为问题在于您的XSLT正在搜索CR
字符的文本 -
。
Windows文件使用CR LF
字符对来终止每行文本,而在Windows系统上运行的Perl版本将剥离CR
以仅留下LF
。< / p>
这提供了与类似Linux的系统兼容的API,它首先只使用LF
,但意味着您的XSLT样式表在查找时找不到任何CR
个字符。 / p>
我建议您更改样式表以搜索LF
字符,这些字符将出现在每行的末尾,而不管文件的来源如何,并且Perl和VBScript都会看到它们。
我认为字符代码最好以十六进制表示,因此您可以在整个XSLT代码中将'
更改为'

。
注意强>
通过进行此更改,您使用CR
后,您的字符串将留下尾随substring-before($text, '
')
。您可以将其留在原位 - 我认为它不会造成任何伤害,因为它不会被浏览器呈现 - 或者您可以在调用时从传递给more
模板的字符串中删除它
<xsl:call-template name="more">
<xsl:with-parameter name="text" value="translate($text, '
', '')"/>
...
</xsl:call-template>
这将使模板具有要处理的干净字符串,不包含CR
个字符。