XSLT样式表适用于vbs脚本,但不适用于Perl

时间:2013-06-24 19:16:24

标签: perl xslt vbscript

我有一个基本上是搜索应用程序的程序,它以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 &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>

1 个答案:

答案 0 :(得分:2)

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

Windows文件使用CR LF字符对来终止每行文本,而在Windows系统上运行的Perl版本将剥离CR以仅留下LF。< / p>

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

我建议您更改样式表以搜索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个字符。