2

我有一个本质上是搜索应用程序的程序,它以 VBScript 和 Perl 形式存在(我正在尝试使用 GUI 制作可执行文件)。

当前,搜索应用程序输出一个 HTML 文件,如果 HTML 中的一段文本长度超过 12 行,那么它会隐藏之后的任何内容并包含一个可点击的More...标签。

这是在 XSLT 中完成的,并且适用于 VBScript。

我从字面上将样式表复制并粘贴到我正在使用的 Perl 程序中,除了More...标记之外,它做的一切都是正确的。

有什么理由可以使用 VBScript 而不是 Perl?

XML::LibXSLT在 Perl 脚本中使用,这里是应该创建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 &gt; 12) and contains($text,'&#13;')">
      <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,'&#13;')">
      <xsl:call-template name="highlight">
        <xsl:with-param name="text" select="substring-before($text,'&#13;')"/>
      </xsl:call-template>
      <xsl:text>&#13;</xsl:text>
      <xsl:call-template name="more">
        <xsl:with-param name="text" select="substring-after($text,'&#13;')"/>
        <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>
4

1 回答 1

2

我认为问题在于您的 XSLT 正在文本中搜索CR字符 - &#13;

Windows 文件使用CR LF字符对来终止每一行文本,并且在 Windows 系统上运行的 Perl 版本将CR去除LF.

这提供了一个与类 Linux 系统兼容的 API,这些系统首先使用,但意味着您的 XSLT 样式表在查找字符时LF找不到任何字符。CR

我建议您更改样式表以搜索LF字符,无论文件的来源如何,这些字符都将出现在每一行的末尾,并且 Perl 和 VBScript 都可以看到这些字符。

我认为字符代码最好用十六进制表示,因此您可以在整个 XSLT 代码中更改'&#13;为。'&#x0A;

笔记

通过进行此更改,您的字符串将在CR使用后留下尾随substring-before($text, '&#x0A;')。你可以把它留在原处——我认为它不会有任何危害,因为它不会被浏览器呈现——或者你可以从more你调用它时传递给模板的字符串中删除

<xsl:call-template name="more">
  <xsl:with-parameter name="text" value="translate($text, '&#x0D;', '')"/>
  ...
</xsl:call-template>

这将使模板留下一个干净的字符串来处理,不包含任何CR字符。

于 2013-06-24T22:18:30.087 回答