2

javascriptで書かれたXSLT 1.0の拡張関数がノードセットを返す簡単な方法はありますか?
このために新しい Java クラスを作成することもできますが、スクリプト自体にいくつかのコードを追加するだけで済みます。
これが、すべてまたはほとんどの XSLT プロセッサでサポートされている別のスクリプト言語 (VB スクリプト? Groovy? C#?) で実行できる場合は、もちろんそれも問題ありません。

次の簡単なスクリプトがあります。

<msxsl:script language="JScript" implements-prefix="custom">
    function xml (input) {
        var x = input.split(";");
        return x.toString();
    }
</msxsl:script>

これは文字列を返すため、Xpath 式で関数を呼び出すのに問題はありません。
私が欲しいのは、ノードセットの結果です。しかし、スクリプトを次のように変更すると

<msxsl:script language="JScript" implements-prefix="custom">
    function xml (input) {
        var x = input.split(";");
        return x;
    }
</msxsl:script>

配列がノードセットに自動的に変換されないため、関数を呼び出すとエラーが発生します。

arrays-with-java-xslt-extensionsを見ましたが、それは、このために新しいクラスを作成する行にあるため、今のところ避けたいと思っています。

では、配列をノードセットに変換し、関数呼び出しを Xpath 式で使用できるようにするには、どのステートメントをスクリプトに追加する必要があるでしょうか?

4

2 に答える 2

2

以下は、 XSLT のスクリプトが拡張関数を実装できるモードで実行されている限り、MSXML 6 で動作するはずの例です。スタイルシートのコードは次のとおりです。

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
  xmlns:ms="urn:schemas-microsoft-com:xslt"
  xmlns:my="http://example.com/my"
  exclude-result-prefixes="ms my">

  <xsl:output method="html" version="5.0"/>

  <ms:script language="JScript" implements-prefix="my">
  <![CDATA[
  function tokenize (input) {
    var doc = new ActiveXObject('Msxml2.DOMDocument.6.0');
    var fragment = doc.createDocumentFragment();
    var tokens = input.split(';');
    for (var i = 0, l = tokens.length; i < l; i++)
    {
      var item = doc.createElement('item');
      item.text = tokens[i];
      fragment.appendChild(item);
    }
    return fragment.selectNodes('item');
  }
  ]]>
  </ms:script>

  <xsl:template match="/">
    <html>
      <head>
        <title>Example</title>
      </head>
      <body>
        <h1>Example</h1>
        <ul>
          <xsl:apply-templates select="my:tokenize('Kibology;for;all')"/>
        </ul>
      </body>
    </html>
   </xsl:template>

   <xsl:template match="item">
     <li>
       <xsl:value-of select="."/>
     </li>
   </xsl:template>

</xsl:stylesheet>
于 2012-04-19T10:06:12.990 に答える
1

ノードを返す場合は、DOM インターフェイスを使用して自分でノードを作成する必要があります。javascript 関数から DOM NodeList を返すと、呼び出し元の XPath コードによって XPath ノードセットとして扱われるのではないかと (記憶から) 疑っていますが、重複するノードとドキュメントの順序の詳細については、仕様を注意深く確認する必要があります。取り扱われます。

ここには標準がないため、XSLT Java または JavaScript 拡張機能に関する質問は、どの製品について話しているかを示す必要があります。

于 2012-04-19T08:27:01.050 に答える