2012-05-17 123 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 
相关问题