我知道这是一个老问题,已经被讨论过好几次了,但我想知道是否有人可以扩展附加查询字符串的 URL 是否可以通过 XSLT 1.0 删除并可以用作供以后使用 XSLT 转换的参数。
例如,我的 URL 为 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)已从查询字符串中提取,以便我可以使用 $param1
和$param2
稍后在 if 条件下说
例如<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="'?&'"/>
</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>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
最佳答案
您的代码中存在一些问题:
-
<xsl:import href="http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/f/strSplit-to-Words.xsl"/>
我怀疑所需的样式表是否可以直接从其 SourceForge View 页面导入 - 特别是考虑到它本身会导入其他 FXSL 样式表。使用 FXSL 的正确方法是将其下载到本地计算机,并从其驻留在本地计算机的文件位置引用其样式表。
...
.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&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="'?&'"/>
</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>
</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
关于XSLT:将 URL 查询字符串作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10633562/