2012-08-06 70 views
1

我有一個xml文檔和一個樣式表,用於將文檔轉換爲另一個有用的xml。 對於引用的XML文檔是有點像這樣:用於XSL轉換的不尋常的輸出

<root> 
<element1>value1</element1> 
<element2>value2</element2> 
<element3>value3</element3> 
<element4>..some more levels of data</element4> 
</root> 

樣式表看起來有點像這樣:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:include href="errorResponse.xsl"/> 
<xsl:template match="root/element4"> 
     <xsl:element name="myRoot"> 
      <xsl:element name="myElement"> 
       <xsl:apply-templates select="./someElement/someOtherElement"/> 
      </xsl:element> 
     </xsl:element> 
</xsl:template> 

這我得到的輸出XML字符串是這樣的:

<?xml version="1.0" encoding="ISO-8859-1"?> 
value1 
value2 
value3 
<myRoot><myelement> some data </myElemrnt></myroot> 

我用於轉換的代碼片段是這樣的:

InputStream styleSheet = new FileUtil().getFileStream("xsltFileName"); 
StreamSource xslStream = new StreamSource(styleSheet); 

DOMSource in = new DOMSource(inputXMLDoc); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

TransformerFactory transFact = TransformerFactory.newInstance(); 
transFact.setURIResolver(new XsltURIResolver()); 
Transformer trans = transFact.newTransformer(xslStream); 
trans.transform(in, new StreamResult(baos)); 
System.out.println(baos.toString()); // displays the above output 

但是輸出格式不合要求。我不想要value1,value2,value3。這也對新生成的XML進一步產生問題,需要處理。

我已經看到了很多關於轉換的問題。這很長時間以來一直困擾着我。如果有人能指出我出錯的地方,我會很感激。

另外指出,如果我在整個過程中遵循任何不正確的約定。

感謝和問候。

+0

您對樣式表有什麼確切的輸出結果?如果沒有這些,就無法幫到你......使用任何其他XSLT處理器時也會發生錯誤嗎?一些瀏覽器可以爲你做,否則使用撒克遜 – amon 2012-08-06 19:58:11

回答

3

由於輸出文本節點的Default Template Rule,您正在獲取該輸出。如果你不想要這些節點,你需要通過匹配它們並將它們替換爲空(即空模板)來明確地排除它們。

嘗試添加該模板樣式表:

<xsl:template match="/"> 
    <xsl:apply-templates select="root/element4"/> 
</xsl:template> 

它匹配的根源並丟棄除了root/element4一切。

+0

我試圖匹配根元素,然後templatize與整個xpath。它以這種方式工作。非常感謝。 然而,我已經與幾個xslts合作過,而且我還沒有面對這樣的問題。 我們可以關閉這種默認行爲嗎?另外,如果我想讓這個默認行爲起作用,但是應該返回節點內的值(而不是單獨的值)。 – 2012-08-07 05:00:55

+0

默認值不可更改,但通過匹配根目錄並選擇要處理的內容,可以「關閉」它。當你匹配你正在控制的根目錄時,除非你用''再次明確地調用它們,否則默認值將不適用,並且沒有其他模板與該點的上下文相匹配。 – 2012-08-07 17:33:09

1

這裏發生的情況是,XSLT built-in templates應用於到任何未被模板顯式匹配的節點。內置模板的最終效果是將任何文本節點(應用了該文本節點)複製到輸出。

一來剿這種不必要的輸出最簡單和最簡單的辦法就是添加下面的模板:

<xsl:template match="text()"/> 

這將導致針對此模板選擇執行的任何文本節點,而不是要複製到輸出。

+0

有道理。謝謝。 – 2012-08-13 08:58:59