首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT:将URL查询字符串作为参数传递

XSLT:将URL查询字符串作为参数传递
EN

Stack Overflow用户
提问于 2012-05-17 18:03:44
回答 1查看 8.1K关注 0票数 2

我知道这是一个老生常谈的问题,已经传了很多次了,但我想知道,是否有人可以扩展一下,是否可以通过XSLT 1.0将附加了查询字符串的URL剥离出来,并将其用作稍后使用XSLT转换的参数。

例如,我有一个网址为http://www.mydomain.com/mypage.htm?param1=a¶m2=b

通过XSLT,我正在寻找类似以下内容的结果:

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

其中,参数名(param1,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:

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-17 20:18:01

您的代码中存在一些问题:

FXSL我怀疑所需的样式表能否直接从它的SourceForge视图页面导入--特别是考虑到它本身也导入了其他FXSL样式表。使用FXSL的正确方法是将其下载到本地计算机,并从本地计算机上它所在的文件位置引用其样式表。

..。

.2。<xsl:with-param name="pStr" select="$pQString"/>这将产生编译错误,因为您错过了定义$pQString全局/外部参数。您需要在全局级别定义此参数。可以为其指定一个默认值(例如,一个特定的URL)以便于测试。但是,使用此参数的想法是,转换的调用者应该将此参数传递给转换。

.3。转换的结果将写入输出。虽然这对于演示目的很好,但您希望能够在稍后的转换中使用这些结果。这样做的方法是在一个变量中捕获这些结果,用一个常规的树(从它的RTF类型)创建另一个变量,然后引用最后一个变量的节点。

这里是您想要的代码示例(假设您已经下载了FXSL,解压缩了发行版,并将此代码保存在与解压后的FXSL发行版相同的目录中):

代码语言:javascript
复制
<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文档(本演示中没有使用)应用此转换时,将生成所需的正确结果--按名称引用结果变量的查询字符串参数:

代码语言:javascript
复制
param1 : a
param2 : b
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10633562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档