查询参数操作

时间:2018-03-20 13:54:59

标签: xml xslt

我有一个URL,其中查询参数需要从中选择一个特定值。

Ex:/ abc / xyz?gcode = 123456& pcode = 21314u925

需要选择此值(gcode = 123456) 我使用了下面的条件

<xsl:value-of select="substring-before(substring-after($currentURI,'?gcode='),'&amp;pcode=')"/>

问题出在URI中,查询参数的顺序并不总是gcode,后面跟着pcode。在gcode之后它可以有任何其他参数。

我怎样才能获得该值

3 个答案:

答案 0 :(得分:1)

我的第一个想法是你应该尝试实现那个序列或类似的东西:

  • 获取您的参数字符串(您可以在'/ abc / xyz?'
  • 之后使用子字符串
  • 使用tokenize函数(获取参数列表)
  • 获取包含gcode的列表元素

Here您可以获得一些示例如何在xslt 1.0或xslt 2.0中使用tokenize

我希望这可以帮助您解决问题

答案 1 :(得分:0)

XSLT-1.0解决方案可以使用xsl:choose来处理这两种可能性:

  1. 另一个参数如下
  2. gcode=是字符串
  3. 中的最后一个参数

    所以有些代码看起来像这样:

    <xsl:variable name="tmp" select="substring-after($currentURI,'gcode=')" />
    <xsl:variable name="GCODE">
        <xsl:choose>
            <xsl:when test="contains($tmp,'&amp;')">  <!-- other parameters do follow -->
                <xsl:value-of select="substring-before($tmp,'&amp;')" />
            </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=
  • &amp;pcode=更改为&amp;
  • 添加concat以添加尾随&amp;,以防gcode是最后一个查询参数

...示例

<xsl:value-of 
 select="substring-before(concat(substring-after($currentURI,'gcode='),'&amp;'),'&amp;')"/>

如果需要多次获取查询参数的值,也可以使用命名模板(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&amp;pcode=21314u925</test>
    <test>/abc/xyz?pcode=21314u925&amp;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,'=')),'&amp;'),
      '&amp;')"/>    
  </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,'=')),'&amp;'),
      '&amp;')"/>    
  </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>