2012-05-17 163 views
2

我知道這是一個老問題,它已經被多次傳遞過,但我想知道是否有人可以擴展是否可以通過連接到查詢字符串的URL XSLT 1.0,並可用作稍後用於XSLT轉換的參數。XSLT:將URL查詢字符串作爲參數傳遞

例如,我有http://www.mydomain.com/mypage.htm?param1=a&param2=b

通過XSLT

一個網址,我找的沿着線的東西造成的:(

<xsl:param name="param1">a</xsl:param><xsl:param name="param2">b</xsl:param>

其中兩個參數名稱參數1 ,param2),它的值(a,b)已經從quesrystring中提取出來,允許我在以後的if條件中使用$param1$param2

例如<xsl:if test="$param1 = 'a'>出來,但如果我們使用<xsl:if test="$param1 = 'b'>出來的假。

我已經在這裏看到了類似的問題:Retrieve page URL params or page URL in XSLT它使用str-split-to-words模板,但我已經失敗了它的工作(可能是因爲我實現它的錯誤的方式),因此它如何可以在實踐中做任何工作的例子是非常有益。

XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common"> 
<xsl:import href="http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/f/strSplit-to-Words.xsl"/> 
<xsl:output indent="yes" method="html"/> 

<xsl:template match="/"> 
<xsl:variable name="vwordNodes"> 
    <xsl:call-template name="str-split-to-words"> 
    <xsl:with-param name="pStr" select="$pQString"/> 
    <xsl:with-param name="pDelimiters" select="'?&amp;'"/> 
    </xsl:call-template> 
</xsl:variable> 
<xsl:apply-templates select="ext:node-set($vwordNodes)/*"/> 
</xsl:template> 

<xsl:template match="word"> 
    <xsl:value-of select="."/> 
    <xsl:text>&#xA;</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 

回答

2

有代碼中的幾個問題:

  1. <xsl:import href="http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/f/strSplit-to-Words.xsl"/>我懷疑,想要的樣式表可以直接從SourceForge的觀點頁面導入 - 尤其是考慮考慮到它本身會導入其他FXSL樣式表。使用FXSL的正確方法是將其下載到本地計算機,並將其樣式表從它駐留在本地計算機上的文件位置引用。

...

0.2。 <xsl:with-param name="pStr" select="$pQString"/>這會產生編譯錯誤,因爲您錯過了定義$pQString全局/外部參數。您需要在全局級別定義此參數。可以給它一個默認值(例如一個特定的URL)以便於測試。然而,使用這個參數的想法是轉換的調用者應該把這個參數傳遞給轉換。

.3。轉換的結果寫入輸出。雖然這對於演示很有用,但您希望能夠稍後在轉換中使用這些結果。這樣做的方法是將這些結果捕獲到變量中,使用常規樹(從其RTF類型)生成另一個變量,然後引用該最後一個變量的節點。

這裏是你想要代碼的實例(前提是你已經下載FXSL,解壓縮後的分佈,並在同一目錄下保存這個代碼FXSL的解壓分佈):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" 
> 

    <xsl:import href="strSplit-to-Words.xsl"/> 

    <xsl:output indent="yes" omit-xml-declaration="yes"/> 

    <xsl:param name="pUrl" select= 
    "'http://www.mydomain.com/mypage.htm?param1=a&amp;param2=b'"/> 

    <xsl:param name="pQString" select= 
    "substring-after($pUrl, '?')" 
    /> 


    <xsl:template match="/"> 
     <xsl:variable name="vwordNodes"> 
      <xsl:call-template name="str-split-to-words"> 
      <xsl:with-param name="pStr" select="$pQString"/> 
      <xsl:with-param name="pDelimiters" 
         select="'?&amp;'"/> 
      </xsl:call-template> 
     </xsl:variable> 

     <xsl:variable name="vrtfqueryParams"> 
     <xsl:apply-templates select="ext:node-set($vwordNodes)/*"/> 
     </xsl:variable> 

     <xsl:variable name="vqueryParams" select="ext:node-set($vrtfqueryParams)/*"/> 

     <xsl:value-of select="$vqueryParams/@name[. ='param1']"/> 
     <xsl:text> : </xsl:text> 
     <xsl:value-of select="$vqueryParams[@name = 'param1']"/> 

     <xsl:text>&#xA;</xsl:text> 
     <xsl:value-of select="$vqueryParams/@name[. ='param2']"/> 
     <xsl:text> : </xsl:text> 
     <xsl:value-of select="$vqueryParams[@name = 'param2']"/> 
    </xsl:template> 

    <xsl:template match="word"> 
     <param name="{substring-before(.,'=')}"> 
     <xsl:value-of select="substring-after(.,'=')"/> 
     </param> 
    </xsl:template> 
</xsl:stylesheet> 

當任何XML文檔(本演示中未使用)應用這種轉變中,想要的,正確的結果 - 通過名稱結果變量的引用的查詢字符串參數 - 生產:

param1 : a 
param2 : b 
相關問題