JAXB XSLT属性替换

时间:2011-06-07 17:34:10

标签: java xml xslt jaxb

我为基本问题道歉。我有一个XML文件,以及一个将其转换为另一种格式(KML)的XSL。在KML中,我希望注入原始XML文档中 not 的动态属性。我想发出如下节点:

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

特别是我希望{@sessionID}文本被替换为动态值,我以某种方式插入到模板中(即,它不是XSLT正在转换的源XML文档的一部分)。

这是我用来编组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);

我已经收集到有一种方法可以通过Attribute Value Templates在XSLT中动态替换值,我假设有一种方法可以将transformer's properties连接到这些属性值模板,但我不太明白它是如何完成的。有人能解开一些光吗?感谢。

2 个答案:

答案 0 :(得分:1)

感谢@jtahlborn让我走上正轨。有可能做到这一点,但我没有将所有部分放在一起。首先,定义xsl:param。

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

其次,插入对此xsl:param的引用。如果您需要将其嵌入节点的内容中,就像我一样,请使用xsl:value-of节点。

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

否则,如果您需要将其嵌入属性字符串中:

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

接下来,从Java中传入该xsl:param的值。

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);

答案 1 :(得分:0)

属性值模板是XSL的一部分,而不是XML的一部分,因此您尝试的内容将不起作用。您可以使用xpath选择与模式“sessionID = {@ sessionID}”匹配的元素,并将其替换为您选择的文本。

我相信您可以使用Transformer.setParameter()方法为样式表设置参数,然后可以使用语法“{$ param}在样式表中引用它“,请参阅示例here