我有一个URL,其中查询参数需要从中选择一个特定值。
Ex:/ abc / xyz?gcode = 123456& pcode = 21314u925
需要选择此值(gcode = 123456) 我使用了下面的条件
<xsl:value-of select="substring-before(substring-after($currentURI,'?gcode='),'&pcode=')"/>
问题出在URI中,查询参数的顺序并不总是gcode,后面跟着pcode。在gcode之后它可以有任何其他参数。
我怎样才能获得该值
答案 0 :(得分:1)
我的第一个想法是你应该尝试实现那个序列或类似的东西:
Here您可以获得一些示例如何在xslt 1.0或xslt 2.0中使用tokenize
我希望这可以帮助您解决问题
答案 1 :(得分:0)
XSLT-1.0解决方案可以使用xsl:choose
来处理这两种可能性:
gcode=
是字符串所以有些代码看起来像这样:
<xsl:variable name="tmp" select="substring-after($currentURI,'gcode=')" />
<xsl:variable name="GCODE">
<xsl:choose>
<xsl:when test="contains($tmp,'&')"> <!-- other parameters do follow -->
<xsl:value-of select="substring-before($tmp,'&')" />
</xsl:when>
<xsl:otherwise> <!-- last parameter -->
<xsl:value-of select="$tmp" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="$GCODE" /> <!-- Value of parameter = '123456' -->
答案 2 :(得分:0)
你接近你的尝试。我会做的是:
?
?gcode=
&pcode=
更改为&
&
,以防gcode
是最后一个查询参数...示例
<xsl:value-of
select="substring-before(concat(substring-after($currentURI,'gcode='),'&'),'&')"/>
如果需要多次获取查询参数的值,也可以使用命名模板(XSLT 1.0+)或xsl:function(XSLT 2.0+)。
...实例
XML输入
<tests>
<test><![CDATA[/abc/xyz?gcode=123456&pcode=21314u925]]></test>
<test><![CDATA[/abc/xyz?pcode=21314u925&gcode=123456]]></test>
<test>/abc/xyz?gcode=123456&pcode=21314u925</test>
<test>/abc/xyz?pcode=21314u925&gcode=123456</test>
</tests>
XSLT 1.0 (小提琴:http://xsltfiddle.liberty-development.net/b4GWVm)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="test">
<xsl:variable name="currentURI" select="."/>
<gcode>
<xsl:call-template name="get-param">
<xsl:with-param name="name" select="'gcode'"/>
<xsl:with-param name="uri" select="$currentURI"/>
</xsl:call-template>
</gcode>
</xsl:template>
<xsl:template name="get-param">
<xsl:param name="name"/>
<xsl:param name="uri"/>
<xsl:value-of
select="substring-before(concat(
substring-after($uri, concat($name,'=')),'&'),
'&')"/>
</xsl:template>
</xsl:stylesheet>
XSLT 2.0 (小提琴:http://xsltfiddle.liberty-development.net/b4GWVm/1)
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:l="local" exclude-result-prefixes="l xs">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:function name="l:get-param">
<xsl:param name="name" as="xs:string"/>
<xsl:param name="uri" as="xs:string"/>
<xsl:value-of
select="substring-before(concat(
substring-after($uri,concat($name,'=')),'&'),
'&')"/>
</xsl:function>
<xsl:template match="test">
<xsl:variable name="currentURI" select="."/>
<gcode>
<xsl:value-of select="l:get-param('gcode',$currentURI)"/>
</gcode>
</xsl:template>
</xsl:stylesheet>
XML输出(来自上面的任一样式表)
<tests>
<gcode>123456</gcode>
<gcode>123456</gcode>
<gcode>123456</gcode>
<gcode>123456</gcode>
</tests>