XSLT как строитель / завод - PullRequest
2 голосов
/ 29 июня 2011

Есть ли способ использовать XSLT как конструктор / фабрику для объектов вместо генерации текстового вывода?Только XPath-выражения отлично подходят для запросов простых вещей, но они утомительны в тех случаях, когда я использую рекурсию в XSLT.

Другими словами, я хотел бы использовать семантику сопоставления с шаблоном XSLT, но каждыйшаблон будет создавать и возвращать объект вместо узла или текста.

В этом сценарии использования будет реализован преобразователь модели, в котором целевая модель - это не какой-то элемент XML, а модель пользовательского домена (в виде графа объекта впамять).

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

Интересный вопрос, то, что вы спрашиваете, похоже на код, сгенерированный генератором парсера, как Alntlr, создаст.

Я думаю, что вы хотите, возможно, создавая объекты как побочный эффект XSLTпреобразования.Вы можете создавать объекты и вызывать методы для объектов из сценария XSLT, используя такой код:

Создание экземпляра Java-объекта в сценарии XSLT;

<!-- Create object factory. -->
<xsl:variable name="factory" xmlns:java="http://xml.apache.org/xalan/java"
    select="java:my.sample.Factory.getInstance()" />

Использование его для создания дерева объектов позжев скрипте:

<xsl:template match="node">
    <xsl:variable name="myObject" xmlns:java="http://xml.apache.org/xalan/java"
                select="java:getInstance($provider, string(@parent), string(@type))" />

Это вызовет метод getInstance (String, String) для объекта фабрики, созданного статическим методом getInstance () в вашем классе my.sample.Factory.Фабрика также должна сохранять созданные объекты, чтобы после завершения преобразования вы могли получить дерево объектов, созданное преобразованием, из экземпляра фабрики.Вместо создания фабрики в сценарии вы можете создать ее заранее и передать в сценарий в качестве параметра.

0 голосов
/ 30 июня 2011

Мой инстинкт должен состоять в том, чтобы ваше XSLT-преобразование генерировало дерево XML обычным способом, а затем направляло это дерево в инструмент связывания данных Java, чтобы превратить его в объекты Java.(Конечно, дерево никогда не нужно сериализовать как лексический XML; возможно, вы можете соединить компоненты с помощью вызовов SAX.).

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