2012-02-09 2 views
3

Следующее из более раннего вопроса, и это больше о синтаксисе xsl. Я хочу разбить часть переменной URL на новую переменную в xsl. Этот код работает, когда переменная сидит частично по URL-адресу. EG: http://www.mysite.com/test.aspx?aVar=something&bVar=somethingMore&cVar=yetMoreStillИспользование подстроки в xsl

<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-адреса. Благодарю.

+0

Я думаю Dimitre уже это ответил http://stackoverflow.com/questions/9211437/passing-a-url-variable -into-xsl –

+0

Спасибо за головы. –

+0

Извините, если это так. Я буду использовать ваш код в ближайшем будущем для другого проекта, который будет представлять ту же проблему, но на шкале lager. Я принял ответ ниже, потому что он ответил на короткий вопрос, который у меня был. Еще раз спасибо за Ваш ответ. –

ответ

7

Как насчет следующего обходного пути?

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

Genius. Простой, изящный ответ. Большое вам спасибо. –

+0

@ user1001421 и VMykyt: Этот ответ неверен в общем случае. Попробуйте с этим URL: 'http://www.mysite.com/test.aspx?subVar=something & bVar = somethingMore'. См. Мой ответ для одного правильного решения. –

+0

В маловероятном случае ваше имя поля существует в конце другого имени поля (а второе - первого), вы, к сожалению, ошибаетесь.Простым решением для этого является адаптация вашего определения testVar к 'substring-after (concat ('&', substring-after ($ url, '?')), '& bVar =')'. Однако, это довольно легко избежать, разумно выбирая имена полей. – Flynn1179

3

Попробуйте использовать разметить (доступный в 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> 
+0

Спасибо, но, к сожалению, я застрял в версии 1.0. –

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

Принятая в настоящее время ответ, как правило, неправильно.

Попробуйте с этим URL:

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" 
Смежные вопросы