2

これはSOで何度も渡されてきた古い質問ですが、クエリ文字列が付加されたURLをXSLT 1.0を介して削除し、後でパラメーターとして使用できるかどうかを誰かが拡張できるかどうか疑問に思っていました。 XSLT変換の使用。

たとえば、http://www.mydomain.com/mypage.htm?param1 = a&param2=bのURLがあります

XSLTを介して、次のような結果を探しています。

<xsl:param name="param1">a</xsl:param><xsl:param name="param2">b</xsl:param>

ここで、パラメーター名(param1、param2)とその値(a、b)の両方がクエリ文字列から抽出されており$param1$param2後でif条件で使用できるようになっています。

たとえば<xsl:if test="$param1 = 'a'>、真になりますが、使用<xsl:if test="$param1 = 'b'>すると偽になります。

私はここで同様の質問を見ました:テンプレートを使用するXSLTでページURLパラメーターまたはページURLを取得しますstr-split-to-wordsが、(おそらく私が間違った方法で実装したために)それを機能させることができませんでした練習は非常に有益です。

XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common">
<xsl:import href="http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/f/strSplit-to-Words.xsl"/>
<xsl:output indent="yes" method="html"/>

<xsl:template match="/">
<xsl:variable name="vwordNodes">
  <xsl:call-template name="str-split-to-words">
    <xsl:with-param name="pStr" select="$pQString"/>
    <xsl:with-param name="pDelimiters" select="'?&amp;'"/>
  </xsl:call-template>
</xsl:variable>
<xsl:apply-templates select="ext:node-set($vwordNodes)/*"/>
</xsl:template>

<xsl:template match="word">
  <xsl:value-of select="."/>
  <xsl:text>&#xA;</xsl:text>
</xsl:template>

</xsl:stylesheet>
4

1 に答える 1

2

コードにはいくつかの問題があります。

  1. <xsl:import href="http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/f/strSplit-to-Words.xsl"/> 必要なスタイルシートを SourceForge ビュー ページから直接インポートできるとは思えません。特に、それ自体が他の FXSL スタイルシートをインポートすることを考慮すると。FXSL を使用する正しい方法は、FXSL をローカル コンピューターにダウンロードし、ローカル コンピューターに存在するファイルの場所からスタイルシートを参照することです。

...

.2. グローバル/外部パラメーター<xsl:with-param name="pStr" select="$pQString"/>を定義していないため、コンパイル エラーが発生します。$pQStringこのパラメータはグローバル レベルで定義する必要があります。テストを容易にするために、デフォルト値 (特定の URL など) を指定できます。ただし、このパラメーターを使用する目的は、変換の呼び出し元がこのパラメーターを変換に渡す必要があるということです。

.3. 変換の結果は出力に書き込まれます。これはデモンストレーション目的には適していますが、後でこれらの結果を変換で使用できるようにする必要があります。これを行う方法は、これらの結果を変数に取り込み、そこから別の変数を作成し、(その RTF タイプから) 通常のツリーを使用して、この最後の変数のノードを参照することです。

必要なコードの例を次に示します(FXSL をダウンロードし、ディストリビューションを解凍し、このコードを FXSL の解凍したディストリビューションと同じディレクトリに保存した場合):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 >

   <xsl:import href="strSplit-to-Words.xsl"/>

   <xsl:output indent="yes" omit-xml-declaration="yes"/>

   <xsl:param name="pUrl" select=
   "'http://www.mydomain.com/mypage.htm?param1=a&amp;param2=b'"/>

   <xsl:param name="pQString" select=
     "substring-after($pUrl, '?')"
     />


    <xsl:template match="/">
        <xsl:variable name="vwordNodes">
          <xsl:call-template name="str-split-to-words">
            <xsl:with-param name="pStr" select="$pQString"/>
            <xsl:with-param name="pDelimiters"
                      select="'?&amp;'"/>
          </xsl:call-template>
        </xsl:variable>

       <xsl:variable name="vrtfqueryParams">
         <xsl:apply-templates select="ext:node-set($vwordNodes)/*"/>
       </xsl:variable>

       <xsl:variable name="vqueryParams" select="ext:node-set($vrtfqueryParams)/*"/>

       <xsl:value-of select="$vqueryParams/@name[. ='param1']"/>
       <xsl:text> : </xsl:text>
       <xsl:value-of select="$vqueryParams[@name = 'param1']"/>

       <xsl:text>&#xA;</xsl:text>
       <xsl:value-of select="$vqueryParams/@name[. ='param2']"/>
       <xsl:text> : </xsl:text>
       <xsl:value-of select="$vqueryParams[@name = 'param2']"/>
    </xsl:template>

    <xsl:template match="word">
      <param name="{substring-before(.,'=')}">
        <xsl:value-of select="substring-after(.,'=')"/>
      </param>
    </xsl:template>
</xsl:stylesheet>

この変換が任意の XML ドキュメント (このデモでは使用されていません) に適用されると、必要な正しい結果 (結果変数の名前で参照されるクエリ文字列パラメーター) が生成されます。

param1 : a
param2 : b
于 2012-05-17T12:18:01.203 に答える