2012-02-09 11 views
3

これ以降の質問に続き、これはxsl構文の詳細です。 URL変数の一部をxslの新しい変数に分割したい。 このコードは、変数がURLに沿って途中で座っているときに機能します。 EG: http://www.mysite.com/test.aspx?aVar=something&bVar=somethingMore&cVar=yetMoreStillxslで部分文字列を使用する

<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

は、したがって、上記のコードは失敗します。私は両方の出来事を許すことができますか?最終的には、URL内のどこにいてもbVarの値を取得しようとしています。ありがとう。

+0

を私はDimitreはすでにhttp://stackoverflow.com/questions/9211437/passing-a-url-variableでこれを答えだと思います-into-xsl –

+0

ヘッドアップありがとう。 –

+0

そのように見えたら申し訳ありません。近い将来、同じ問題を出すが、より大きなスケールであなたのコードを使用する予定です。私は短期的な問題に答えるので、私は以下の答えを受け入れました。ご返信ありがとうございます。 –

答えて

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' 1つの正しい解決策については私の答えを見てください。 –

+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でそれを試してみてください:あなたはそれを再利用するだろう答えを読む場合は、この質問が既に回答されたsomething

...

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

、あなたは間違った結果を取得します生成された結果からあなたの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" 
関連する問題