1

XSLT スタイルシートから静的 Java メソッドを呼び出そうとしています。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:digest="java:org.apache.commons.codec.digest.DigestUtils">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>

<xsl:template match="user">
  <user>
    <firstname>
      <xsl:value-of select="value[@type='firstname'][1]" />
    </firstname>
    <lastname>
      <xsl:value-of select="value[@type='name'][1]" />
    </lastname>
    <password>
      <xsl:variable name="password" select="string(value[@type='password'][1])" />
      <xsl:value-of select="digest:md5Hex($password)"
                    disable-output-escaping="yes" />
    </password>
  </user>
</xsl:template>

DigestUtils クラスが見つかり、静的な md5Hex-method [1] も同様です。問題は、メソッドを呼び出す方法が 3 通りあることです。つまり、byte[]、InputStream、または String を使用します。「password」変数が xs:string 型であることを考えると、Saxon が自動的に最後のオプションを選択すると想定しました。しかし代わりに、それは byte[] メソッドを主張し、それに応じて失敗します:

[...]
Loading org.apache.commons.codec.digest.DigestUtils
Looking for method md5Hex in Java class class org.apache.commons.codec.digest.DigestUtils
Number of actual arguments = 1
[...]
Trying method md5Hex: name matches
Method is static
Method has 1 argument; expecting 1
Found a candidate method:
    public static java.lang.String org.apache.commons.codec.digest.DigestUtils.md5Hex(byte[])
Trying method md5Hex: name matches
Method is static
Method has 1 argument; expecting 1
Found a candidate method:
    public static java.lang.String org.apache.commons.codec.digest.DigestUtils.md5Hex(java.io.InputStream) throws java.io.IOException
Trying method md5Hex: name matches
Method is static
Method has 1 argument; expecting 1
Found a candidate method:
    public static java.lang.String org.apache.commons.codec.digest.DigestUtils.md5Hex(java.lang.String)
[...]
Finding best fit method for arguments
Trying option 0: public static java.lang.String org.apache.commons.codec.digest.DigestUtils.md5Hex(byte[])
Conversion preferences are [24]
Trying option 1: public static java.lang.String    org.apache.commons.codec.digest.DigestUtils.md5Hex(java.io.InputStream) throws java.io.IOException
Conversion preferences are [80]
Trying option 2: public static java.lang.String org.apache.commons.codec.digest.DigestUtils.md5Hex(java.lang.String)
Conversion preferences are [80]
Eliminating option 1
Eliminating option 2
Number of candidate methods remaining: 1
Error at xsl:template on line 14 column 30 of migrate_users.xsl:
  Cannot convert from xs:string to byte
Failed to compile stylesheet. 1 error detected.

Saxon に String メソッドを強制的に使用させる方法はありますか?

[1] http://commons.apache.org/codec/api-release/org/apache/commons/codec/digest/DigestUtils.html#md5Hex(java.lang.String )

-- 更新:同僚が、Saxon 9.4PE の会社のライセンス キーを見つけました。残念ながら、エラーは解決しません。変更された唯一のことは、byte[] メソッドの変換設定が 24 から 31 になったことです。

4

2 に答える 2

3

変数を入力する必要があります。

<xsl:variable as="xs:string" name="password" select="string(value[@type='password'][1])" />

または呼び出しでキャストします。

<xsl:value-of select="digest:md5Hex(xs:string($password))"
                disable-output-escaping="yes" />

xs 名前空間は次のように定義されています。

xmlns:xs="http://www.w3.org/2001/XMLSchema"
于 2012-07-12T09:22:47.327 に答える
3

Saxon は、指定された引数の型の静的分析に基づいて、コンパイル時に使用するメソッドを決定しようとします。推論された静的型が (シングルトンとは異なり) シーケンスを許可する場合、配列またはコレクションを期待するメソッドは、シングルトンを期待するメソッドよりも常に優先されます: したがって、byte[] を期待するメソッドが優先されたという事実は、 Saxon は、指定された値がシングルトンであることを認識できませんでした。この推論を有効にするには、文字列へのキャストで十分であることは明らかです。

変数宣言に型情報を追加するだけでは不十分なのが残念です。この理由は、型情報が変数宣言から変数参照に伝播される前に、使用するメソッドの決定がコンパイル プロセス中に行われるのが早すぎるためです。将来のリリースでこれを改善する可能性を検討します。

于 2012-07-12T10:32:33.713 に答える