Таблица стилей, ссылающаяся на переменную в фигурных скобках, не компилируется - PullRequest
3 голосов
/ 21 февраля 2012

Я пытаюсь выполнить XSLT-преобразование в Java. Вот таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="person">
        <xsl:variable name="varname">info</xsl:variable>
        <xsl:element name="{$varname}">content</xsl:element>
    </xsl:template>
</xsl:stylesheet>

(Это очень упрощенный пример, демонстрирующий проблему. На самом деле мне действительно нужно определить переменную и затем использовать ее).

Вот код Java:

DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc=builder.parse(new File("C:\\temp\\test.xsl"));
DOMSource xsl=new DOMSource(doc);
Transformer transformer=TransformerFactory.newInstance().newTransformer(xsl);

При запуске выдает исключение:

ERROR:  'Variable or parameter 'varname' is undefined.'
FATAL ERROR:  'Could not compile stylesheet'
javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:824)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:619)

Эта же таблица стилей отлично работает в других движках (в Internet Explorer, в MSXML, в GNU xsltproc). Что я делаю неправильно? Может быть, эта функция не поддерживается в Java? Или, может быть, я должен сначала установить некоторые параметры для TransformerFactory или что-то еще?

1 Ответ

2 голосов
/ 21 февраля 2012

Кажется, сообщение об ошибке полностью вводит в заблуждение. Фактическая проблема заключается в том, что DocumentBuilder не настроен для поддержки пространства имен и поэтому не распознает объявление xsl:variable. Парсер каким-то образом все еще распознает выражение в фигурных скобках. Вы можете решить эту проблему, включив синтаксический анализ пространства имен на DocumentBuilderFactory:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File("C:\\temp\\test.xsl"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...