2011-06-07 147 views
1

我對基本問題表示歉意。我有一個XML文件,以及一個XSL將其轉換爲另一種格式(KML)。在KML中,我希望在原始XML文檔中注入動態屬性而不是。我想發出像一個節點以下:JAXB XSLT屬性替換

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

我已經收集有中值來代替動態地通過Attribute Value Templates的XSLT的方式,我認爲是有辦法連接transformer's properties與這些屬性值模板一起使用,但我不太明白它是如何完成的。有人可以點亮一些光線嗎?謝謝。

回答

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> 

否則,如果你需要一個屬性字符串中嵌入它:從Java內部PARAM:

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

接下來,在經過該XSL的值。

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

屬性值模板是XSL的一部分,而不是XML的一部分,所以您嘗試的操作將不起作用。您可以使用xpath來選擇與模式「sessionID = {@ sessionID}」匹配的元素,並將其替換爲您選擇的文本。

我相信你可以使用Transformer.setParameter()方法,然後可以在樣式使用語法「{$ PARAM}」引用設置參數的樣式表,見例子here

+0

「您選擇的文本」 - 我需要通過Java將該文本注入到模板中。這不可能嗎?在這一點上,我正在考慮手動使用Java String.replace方法來替換該子字符串,但這似乎是一種破解。 – I82Much 2011-06-07 19:49:00