Как вызвать внешнюю функцию Java в файле XSLT? - PullRequest
2 голосов
/ 12 октября 2011

У меня есть этот xslt-файл, который мне нужен для вызова java-функции, размещенной где-то еще в том же приложении.В файле xslt у меня есть

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:java="java" 
                xmlns:test_my="vobs.plugins.WikiParser.WikiParser"
                version="2.0">
  <xsl:output indent="yes" method="html"/>
  <xsl:template match="/">
    <H1>
      <xsl:value-of select="WikiDescription/Title"/>
    </H1>
    Summary: <xsl:value-of select="WikiDescription/Description"/>
    <xsl:variable name="text">                      
      <xsl:value-of select="WikiDescription/Text"/>
    </xsl:variable>
    <p>
      <xsl:value-of select="test_my:parse2($text)" 
                    disable-output-escaping="yes"/>
    </p>

, но когда я пытаюсь выполнить этот файл xlst, я получаю следующую ошибку

XSL transform reported error: 
XPath syntax error at char 21 on line -1 in {test_my:parse2($text)}: 
Cannot find a matching 1-argument function named 
{vobs.plugins.WikiParser.WikiParser}parse2()

, похоже, что он не может найти класс javaтак, каков правильный способ сделать это?Пример кода будет еще лучше.Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 06 марта 2013

У меня была точно такая же проблема, и это решило ее для меня, где urn:java: и java: оба потерпели неудачу.

Предполагая, что вы используете Xalan для преобразования, вы должны изменить xmlns:test_my="vobs.plugins.WikiParser.WikiParser" на xmlns:test_my="xalan://vobs.plugins.WikiParser.WikiParser".

3 голосов
/ 29 мая 2013

Это зависит от того, какой процессор преобразования XSLT вы используете. Саксонский использует urn:java:; Xalan использует xalan://.

2 голосов
/ 12 октября 2011

Вам нужно изменить объявление пространства имен (в элементе xsl: stylesheet) с xmlns:test_my="vobs.plugins.WikiParser.WikiParser" на xmlns:test_my="urn:java:vobs.plugins.WikiParser.WikiParser"

Объяснение таково: чтобы использовать класс C из пакета a.b, вам нужно определить префикс пространства имен и связать его с urn:java:a.b.C.

Если я правильно понимаю XSL, префикс urn: необходим при импорте кода Java, который не является частью стандартной библиотеки (как в вашем случае). Если вам нужно только импортировать стандартные библиотечные классы, тогда подойдет "java:".

(подробнее: http://cafeconleche.org/books/xmljava/chapters/ch17s03.html)

[РЕДАКТИРОВАТЬ: изменить "Java:" -> "Урна: Java:"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...