将文件路径从XSL传递到JavaScript函数

时间:2012-07-25 13:07:00

标签: javascript xslt

我正在尝试将文件夹路径从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。

提前致谢。

1 个答案:

答案 0 :(得分: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 reference)......

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

\\的原因是第2和第3个参数是正则表达式,因此需要\转义。

如果您使用的是XSLT 1.0,那么我刚发现this post via 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>