JAXB XSLT Замена имущества - PullRequest
1 голос
/ 07 июня 2011

Прошу прощения за простейший вопрос. У меня есть файл XML, а также XSL для перевода его в другой формат (KML). В KML я хочу добавить динамический атрибут, который не присутствует в исходном документе XML. Я хочу создать узел, подобный следующему:

<NetworkLinkControl>
    <message>This is a pop-up message. You will only see this once</message>
    <cookie>sessionID={@sessionID}</cookie>
    <minRefreshPeriod>5</minRefreshPeriod>
  </NetworkLinkControl>

В частности, я хочу, чтобы текст {@sessionID} был заменен динамическим значением, которое я каким-либо образом вставляю в шаблон (т.е. НЕ является частью исходного XML-документа, который преобразует XSLT).

Вот код, который я использую для маршалинга KML:

DomainObject myObject = ...;

JAXBContext context = JAXBContext.newInstance(new Class[]{DomainObject.class});
Marshaller xmlMarshaller = context.createMarshaller();
xmlMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);


TransformerFactory transFact = TransformerFactory.newInstance();
// converts from jaxb XML representation into KML
Templates displayTemplate = transFact.newTemplates(new StreamSource(new File("conf/jaxbkml.xsl")));

Result outputResult = new StreamResult(System.out);

TransformerHandler handler = 
  ((SAXTransformerFactory) transFact).newTransformerHandler(displayTemplate);
handler.setResult(outputResult);

Transformer transformer = handler.getTransformer();
// TODO: what do I actually fill in here to ensure that the session ID comes through
// in the XSLT document? I can't make heads or tails of the javadocs
transformer.setOutputProperty("{http://xyz.foo.com/yada/baz.html}sessionID", "asdf");

xmlMarshaller.marshal(myObject, handler);

Я понял, что есть способ динамически подставлять значения в XSLT с помощью шаблонов значений атрибутов , и я предполагаю, что есть способ подключить свойства преобразователя к используется с этими шаблонами значений атрибутов, но я не совсем понимаю, как это делается. Может ли кто-то пролить свет? Спасибо.

Ответы [ 2 ]

1 голос
/ 10 июня 2011

Спасибо @jtahlborn за то, что поставили меня на правильный путь.Это можно сделать, но я не собирал все кусочки вместе.Во-первых, определите xsl: param.

<!-- give it a default value if none is set -->
<xsl:param name="sessionID" select="''"/>

Во-вторых, вставьте ссылку на этот xsl: param.Если вам нужно встроить его в содержимое узла, как я, используйте xsl: value-of node.

<cookie>sessionID=<xsl:value-of
select="$sessionID"/></cookie>

В противном случае, если вам нужно встроить его в строку атрибутов:

<img src="{$sessionID}/sample.gif"/>

Затем передайте значение для этого xsl: param из Java.

Result outputResult = new StreamResult(outputStream);
TransformerHandler handler = 
 ((SAXTransformerFactory) transFact).newTransformerHandler(displayTemplate);

Transformer transformer = handler.getTransformer();
// Here is where the parameter is bound.
transformer.setParameter("sessionID", sessionID);

handler.setResult(outputResult);
xmlMarshaller.marshal(listWrapper, handler);
0 голосов
/ 07 июня 2011

Шаблоны значений атрибутов являются частью вашего XSL, а не частью вашего XML, поэтому то, что вы пытаетесь, не сработает. Вы можете использовать xpath, чтобы выбрать элемент, который соответствует шаблону "sessionID = {@ sessionID}", и заменить его текстом на ваш выбор.

я полагаю, что вы можете установить параметры для таблицы стилей, используя метод Transformer.setParameter(), на который можно затем ссылаться в таблице , используя синтаксис "{$ param}", см. Примеры здесь .

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