我为基本问题道歉。我有一个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连接到这些属性值模板,但我不太明白它是如何完成的。有人能解开一些光吗?感谢。
答案 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。