4

次のコードがあります

<xsl:result-document href="output1/output3/index.html" format="html">
 <html>
 <head>
<SCRIPT LANGUAGE="JavaScript">
function getParams() 
{
var idx = document.URL.indexOf('?');
var params = new Array();
if (idx != -1) {
var pairs = document.URL.substring(idx+1, document.URL.length).split('&amp;');
for (var i=0; i&lt;pairs.length; i++) {
nameVal = pairs[i].split('=');
params[nameVal[0]] = nameVal[1];
   }
}
return params;
}
params = getParams();
</SCRIPT>

<SCRIPT LANGUAGE="JavaScript">
val = unescape(params["value"]);
document.write("value = " + val);
</SCRIPT>
</head>

<body>
 <xsl:choose>
    <xsl:when test="a:id=''">
    <xsl:value-of select="a:name"/>
    </xsl:when>
 </xsl:choose>
</body>
</html>
</xsl:result-document>

xsl:when' で JavaScript 変数 'val' にアクセスしたい。条件を実行できるように値が必要です。任意のアイデア - 方法は?

4

3 に答える 3

1

Saxon-CEは、ブラウザで実行される XSLT 2.0 プロセッサです。JavaScript にコンパイルされ、高レベルの JavaScript 相互運用性を提供します。JavaScript/DOM ノード、数値、文字列、ブール値、および配列 (XSLT 2.0 シーケンスに変換) は、JavaScript/XSLT インターフェイス全体で比較的シームレスに機能します。

特定のケースでは、Saxon-CE にさまざまなオプションがあります。ixsl:call()を使用して既存または挿入された JavaScript 関数を直接呼び出すか、ixsl:get()を使用して変数の値を取得できます。または、XSLT 2.0 内からすべてを行うことができます。

[コメントに記載されている修正を加えて編集]

XSLT コード

これは、グラフィックではなくテキストとして含まれている同じコードです - フォーマットなし

<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ixsl="http://saxonica.com/ns/interactiveXSLT"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:f="urn:local-function"
xmlns:a="urn:source-xml"
extension-element-prefixes="ixsl"
version="2.0"
>
<xsl:template match="/">
<xsl:variable name="urlparams" select="ixsl:get(
ixsl:get(ixsl:window(),'location'),
'search')"
as="xs:string"/>
<xsl:variable name ="pairs" select="tokenize(substring($urlparams,2), '&amp;')"
as="xs:string*"/>
<xsl:variable name="value" select="f:getValue($pairs)"/>
<p>value: <xsl:value-of select="$value"/></p>

<xsl:choose>
<xsl:when test="a:id eq $value">
<xsl:value-of select="a:name"/>
</xsl:when>
</xsl:choose>

</xsl:template>

<xsl:function name="f:getValue" as="xs:string*">
<xsl:param name="pairs" as="xs:string*"/>
<xsl:sequence select="for $p in $pairs,
   $v in substring-before($p, '=')
return
    if ($v eq 'value')
        then substring($p, string-length($v) + 2)
    else ()"/>
</xsl:function>

</xsl:transform>
于 2012-06-11T08:52:12.917 に答える
1

さまざまな XSLT エンジンでは、変換サイクルで JavaScript を実行できます。ただし、出力マークアップの一部としてスクリプトを含めているだけです (つまり、通常の JS)。

IBM の例を参照してください。JavaScript を含めて実行するための特別なタグがあり、エンジンごとに異なります。関数を使用して JavaScript の一部から値を返すことに注意してください。変数に直接アクセスできない場合は、関数を記述して値を返します。

于 2012-06-08T10:25:31.453 に答える
0

あなたが求めていることは不可能です:JavaScriptはページがレンダリングされるときにブラウザによって実行されます-そしてJavaScriptはページのURLを解析しているので、ブラウザだけが知っているので、それを回避する方法はありません。

一方、XSLTはHTMLページを生成するため、ブラウザが実行するJavaScriptを確認する前に実行されます。

于 2012-06-08T14:39:40.547 に答える