JAXB XSLT属性替换



我为这个基本问题道歉。我有一个XML文件,以及一个将其转换为另一种格式(KML)的XSL。在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}文本被一个动态值所取代,我以某种方式将该值插入到模板中(即,它不是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);

我已经了解到,有一种方法可以通过属性值模板在XSLT中动态替换值,并且我认为有一种方式可以连接转换器的属性以与这些属性值模板一起使用,但我不太清楚它是如何做到的。有人能给我点光吗?谢谢

感谢@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"/>

接下来,从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);

属性值模板是XSL的一部分,而不是XML的一部分。您可以使用xpath来选择与模式"sessionID={@sessionID}"匹配的元素,并将其替换为您选择的文本。

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

最新更新