2012-12-11 89 views
1

我有一個HTML頁面,其中包含一些我試圖用XSLT 1.0解析的Javascript。我想修改Javascript中的一個URL,使路徑變爲絕對路徑而不是相對路徑。用XSLT替換Javascript內容

的JavaScript代碼看起來大致是這樣的:

<html> 
    <head> 
     <script> 
      function login() { 
       window.location = '{@myBase}/myloginpage'; 
      } 
     </script> 
    </head> 

    <body> 
    ... 
    </body> 
</html> 

我想要的 '{} @myBase' 與我的域名來代替。我覺得我非常偏離正軌。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:proxy="java:senselogic.sitevision.portlet.proxy.web.ProxyFunctions" 
    extension-element-prefixes="proxy"> 


    <xsl:import href="template.xsl"/> 

    <xsl:template match="//script/text()"> 
     <xsl:variable name="mypath"> 
      <xsl:call-template name="string-replace-all"> 
      <xsl:with-param name="text"><xsl:value-of select="{@myBase}"/></xsl:with-param> 
      <xsl:with-param name="replace">{@myBase}</xsl:with-param> 
      <xsl:with-param name="by">http://www.mydomain.com</xsl:with-param> 
      </xsl:call-template> 
     </xsl:variable> 
    </xsl:template>  



    <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:stylesheet> 
+0

轉化與XSLT的HTML頁面中的腳本的概念是,坦率地說,瘋狂。在不瞭解整體環境的情況下,很難肯定地說,但有人可能會注意到這是一個單行sed程序。其他選擇取決於誰擁有HTML,包括使用文本編輯器將{@myname}更改爲您的域。 :-)如果您可以將自己的腳本添加到頁面中,則可以使用String.replace進行單行處理。最重要的是,XSLT的核心是處理XML,它不是正確的方式來做文本的東西。是什麼讓你認爲你想使用XSLT? – 2012-12-11 17:06:51

回答

2

其實,你並不遙遠。

首先,您正在定義一個變量<xsl:variable name="mypath">來保存調用模板的結果,但實際上沒有做任何事情。我不認爲你需要把它包裝在變量聲明中。

其次,您沒有將正確的值傳遞給文本參數。相反,這樣做

<xsl:with-param name="text"><xsl:value-of select="{@myBase}"/></xsl:with-param> 

做這個

<xsl:with-param name="text"><xsl:value-of select="."/></xsl:with-param> 

或者更好的做法是:

<xsl:with-param name="text" select="."/> 

試試這個XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:proxy="java:senselogic.sitevision.portlet.proxy.web.ProxyFunctions" extension-element-prefixes="proxy"> 
    <xsl:param name="domain" select="'http://www.mydomain.com'"/> 

    <xsl:template match="//script/text()"> 
     <xsl:call-template name="string-replace-all"> 
      <xsl:with-param name="text" select="."/> 
      <xsl:with-param name="replace" select="'{@myBase}'" /> 
      <xsl:with-param name="by" select="$domain"/> 
     </xsl:call-template> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <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:stylesheet> 

(請注意,我還設置你的域名是一個參數)

當適用於您的XHTML,下面是輸出

<html> 
<head> 
<META http-equiv="Content-Type" content="text/html"> 
<script> 
      function login() { 
       window.location = 'http://www.mydomain.com/myloginpage'; 
      } 
     </script></head> 
<body> 
    ... 
    </body> 
</html> 
+0

Tim,爲什麼不簡化''爲''? –

+0

它工作出色!謝謝:) – user1894413

+0

我按照Martin的建議略微簡化了參數。謝謝馬丁! –