2012-07-12 2 views
1

Я пытаюсь вызвать статический метод Java из моих таблицы стилей XSLT:Saxon: Невозможно вызвать статический метод ожидает строку с хзом: параметр строки из XSLT

<?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-метода [1]. Проблема в том, что существует три возможных способа вызова метода, а именно с байтом [], InputStream или String. Учитывая, что переменная «password» имеет тип xs: string, я предположил, что Saxon автоматически выберет последний вариант. Но вместо этого, он настаивает на байт [] - метод и не соответствующим образом:

[...] 
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 использовать струнный-метод?

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

- обновление: Коллега только что лицензионный ключ компании для саксонского 9.4PE. К сожалению, ошибка не будет устранена, единственное, что изменилось в том, что предпочтение преобразования для Byte [] - метод пошел от 24 до 31.

ответ

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" /> 

с хв пространства имен определяется как:

xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+0

Благодарим вас за то, что вы выбрали переменную во время разговора. Однако вводить переменную не помогло. Во всяком случае, остается вопрос, почему он не работал в первую очередь, поскольку Saxon явно получил аргумент xs: string (как видно из сообщения об ошибке). – jbaiter

3

Саксон пытается д ecide, какой метод использовать во время компиляции, основываясь на его статическом анализе типа поставленного аргумента. Если выведенный статический тип допускает последовательность (в отличие от одиночного), то метод, ожидающий, что массив или коллекция всегда будет побеждать над методом, который ожидает одноэлементный: поэтому тот факт, что метод, ожидающий байт [], был предпочтительным, означает, что Саксон не смог понять, что поставленная стоимость была синглом. Очевидно, что приведение в строку достаточно для включения этого вывода.

Неудивительно, что добавления информации типа к объявлению переменной недостаточно. Причина этого в том, что решение о том, какой метод использовать, делается слишком рано во время процесса компиляции, прежде чем информация о типе была распространена из объявления переменной в ссылку на переменную. Я рассмотрю возможность улучшения этого для будущего выпуска.

 Смежные вопросы

  • Нет связанных вопросов^_^