0

我正在尝试将文件夹路径从 XSL 传递给 JavaScript。JavaScript 中有函数,并且该函数在 XSL 中 HTML 按钮的 onClick 按钮上被调用。路径类似于“C:\ABC\DEF\GH”。在发出警报时,我看到该路径正在发送,例如:“CABCDEFGH”。所有的斜线都被删除。即使我删除了 OnClick 事件上的函数调用,只是用硬编码路径在那里发出警报,仍然是一样的。它删除了所有的斜线。

<img class="viewcls" src="images/copy.jpg" title="Copy Profile" onclick="fnCopyProfile({$CurlDPID},'{@T}','{SOURCE/I/@DP}')"/>

这里 fnCopyProfile 函数的最后一个参数是一个 XPath,其值将是一个文件路径,如 C:\ABC\DEF\GH。在 JS 中,它没有斜线。

即使我将警报放在 XSL 本身中,例如:

<img class="viewcls" src="images/copy.jpg" title="Copy Profile" onclick="alert('{SOURCE/I/@DP}');fnCopyProfile({$CurlDPID},'{@T}','{SOURCE/I/@DP}')"/>

然后它也显示没有斜线的路径。

但是,如果我这样做:

<xsl:value-of select="SOURCE/I/@DP" />

然后它显示带有斜杠的路径,但是我想我们不能像这样将值传递给 JS。

如何将带有斜杠的确切路径发送到 JavaScript。

提前致谢。

4

1 回答 1

0

确保您正在转义所有\字符。在 JavaScript 字符串中使用时,\用于表示控制字符(例如\n换行符)。

因此,您需要做的是将所有\字符替换为\\.

我不知道您将如何使用您正在使用的内联变量来做到这一点(希望 Dimitre 会向我们展示)。

但是,你可以这样做......

<img class="viewcls" src="images/copy.jpg" title="Copy Profile">
  <xsl:attribute name="onclick">fnCopyProfile(<xsl:value-of select="$CurlDPID"/>,'<xsl:value-of select="@T"/>','<xsl:value-of select="translate(SOURCE/I/@DP,'\','\\')"/>');</xsl:attribute>
</img>

更新

以上不能工作,因为translate用单个字符替换单个字符。

如果您使用的是 XSLT 2.0,那么我相信您可以做到这一点(w3.org 参考)...

<xsl:value-of select="replace(SOURCE/I/@DP,'\\','\\\\'")/>

的原因\\是第二个和第三个参数是正则表达式,所以需要\转义。

如果您使用的是 XSLT 1.0,那么我刚刚通过 Google 找到了这篇文章,它提供了“搜索和替换”模板

<xsl:template name="string-replace-all">
  <xsl:param name="text" />
  <xsl:param name="replace" />
  <xsl:param name="by" />
  <xsl:choose>
    <xsl:when test="contains($text, $replace)">
      <xsl:value-of select="substring-before($text,$replace)" />
      <xsl:value-of select="$by" />
      <xsl:call-template name="string-replace-all">
        <xsl:with-param name="text"
        select="substring-after($text,$replace)" />
        <xsl:with-param name="replace" select="$replace" />
        <xsl:with-param name="by" select="$by" />
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$text" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

您应该可以这样称呼它(我已将其放入变量中以使其更清晰)...

<xsl:variable name="mypath">
  <xsl:call-template name="string-replace-all">
    <xsl:with-param name="text"><xsl:value-of select="SOURCE/I/@DP"/>
    <xsl:with-param name="replace">\</xsl:with-param>
    <xsl:with-param name="by">\\</xsl:with-param>
  </xsl:call-template>
</xsl:variable>
<img class="viewcls" src="images/copy.jpg" title="Copy Profile">
  <xsl:attribute name="onclick">fnCopyProfile(<xsl:value-of select="$CurlDPID"/>,'<xsl:value-of select="@T"/>','<xsl:value-of select="$mypath"/>');</xsl:attribute>
</img>
于 2012-07-25T13:24:07.977 回答