繁体   English   中英

JAXB XSLT 属性替换

[英]JAXB XSLT Property substitution

我为这个基本问题道歉。 我有一个 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}文本替换为我以某种方式插入到模板中的动态值(即不是 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 节点。

<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 到 select 匹配模式“sessionID = {@sessionID}”的元素,并将其替换为您选择的文本。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM