在xsl中使用子字符串

时间:2012-02-09 15:28:33

标签: xslt xslt-1.0

继续之前的问题,这更多是关于xsl语法。我想将URL变量的一部分拆分为xsl中的新变量。 当变量位于URL的一部分时,此代码有效。例如: http://www.mysite.com/test.aspx?aVar=something&bVar=somethingMore&cVar=yetMoreStill

    <xsl:variable name="testVar" select="substring-after($url, 'bVar=')"/>
    <xsl:value-of select="substring-before($testVar, '&amp;')" />

问题是变量有时会位于URL的末尾(我无法控制)EG: http://www.mysite.com/test.aspx?aVar=something&bVar=somethingMore

所以上面的代码失败了。有没有我可以允许两次出现?结束游戏我只是试图获得bVar的价值,无论它在URL中的位置。感谢。

4 个答案:

答案 0 :(得分:7)

以下解决方法如何?

<xsl:variable name="testVar" select="substring-after($url, 'bVar=')"/>
<xsl:value-of select="substring-before(concat($testVar, '&amp;'), '&amp;')" />

答案 1 :(得分:3)

尝试使用tokenize(在XSLT 2.0中可用),如下所示:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" omit-xml-declaration="yes" method="xml" version="1.0"/>

    <xsl:template match="/">
        <xsl:variable name="test"><![CDATA[http://www.mysite.com/test.aspx?aVar=something&bVar=somethingMore&cVar=yetMoreStill]]></xsl:variable>
        <xsl:variable name="splitURL" select="tokenize($test,'&amp;')"/>
        <xsl:variable name="bvar" select="$splitURL[starts-with(.,'bVar')]"/>
        <out><xsl:value-of select="substring-after($bvar, 'bVar=')"/></out>
    </xsl:template>
</xsl:stylesheet>

答案 2 :(得分:3)

试试这个。这是XSLT 1.0:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xsl:template match="/">
    <xsl:call-template name="urlResolver">
        <xsl:with-param name="input" select="'http://www.mysite.com/test.aspx?aVar=something&amp;bVar=somethingMore'" />
    </xsl:call-template>
    <xsl:call-template name="urlResolver">
        <xsl:with-param name="input" select="'http://www.mysite.com/test.aspx?aVar=something&amp;bVar=somethingMore&amp;cVar=yetMoreStill'" />
    </xsl:call-template>
</xsl:template>

<xsl:template name="urlResolver">
    <xsl:param name="input" />
    <xsl:variable name="testVar" select="substring-after($input, 'bVar=')"/>
    <xsl:choose>
        <xsl:when test="contains($testVar, '&amp;')"><xsl:value-of select="substring-before($testVar, '&amp;')" /></xsl:when>
        <xsl:otherwise><xsl:value-of select="$testVar" /></xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

答案 3 :(得分:3)

目前接受的答案通常是错误的

尝试使用此网址:

http://www.mysite.com/test.aspx?subVar=something&amp;bVar=somethingMore

你得到了错误的结果:something

这个问题已经回答了...... 如果您阅读了答案,您只需重复使用它并从生成的结果中获取您的QString:

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>

     <xsl:param name="pUrl" select=
     "'http://www.mysite.com/test.aspx?subVar=something&amp;bVar=somethingMore'"/>

     <xsl:template match="/">
       <xsl:variable name="vrtfQStrings">
           <xsl:call-template name="GetQueryStringParams"/>
         </xsl:variable>

         bVar = "<xsl:value-of select="ext:node-set($vrtfQStrings)/bVar"/>"
     </xsl:template>

     <xsl:template name="GetQueryStringParams">
      <xsl:param name="pUrl" select="$pUrl"/>

          <xsl:variable name="vQueryPart" select=
          "substring-before(substring-after(concat($pUrl,'?'),
                                            '?'),
                          '?')"/>

          <xsl:variable name="vHeadVar" select=
           "substring-before(concat($vQueryPart,'&amp;'), '&amp;')"/>

           <xsl:element name="{substring-before($vHeadVar, '=')}">
             <xsl:value-of select="substring-after($vHeadVar, '=')"/>
           </xsl:element>

        <xsl:variable name="vRest" select="substring-after($vQueryPart, '&amp;')"/>

        <xsl:if test="string-length($vRest) > 0">
           <xsl:call-template name="GetQueryStringParams">
             <xsl:with-param name="pUrl" select=
             "concat('?', substring(substring-after($vQueryPart, $vHeadVar), 2))"/>
           </xsl:call-template>
        </xsl:if>
     </xsl:template>
</xsl:stylesheet>

当应用于任何XML文档(未使用)时,此转换会生成所需的正确结果

     bVar = "somethingMore"