2011-03-07 55 views
1

我需要從一個XML文件中提取日誌meesages並把它們寫出來,以純文本文件。日誌消息有兩種口味,我想將它們寫入單獨的文件。XSLT條件寫入到兩個不同的文件

我寫了一個樣式表不正是我需要的只是它有時會造成空的文件,因爲XML文件可以不包含一種或另一種的消息。

我很納悶,1)如果有什麼我是個做的是做到這一點的最佳方法,以及2)如果有一種方法來抑制空文件。因爲它已被重新輸入

我的樣品可能包含錯誤。 (原來是一個封閉的網絡上)

注:我使用XSLT 2.0特性。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

<xsl:output method="text" encoding="iso-8859-1" /> 

<xsl:param name="break" select="string('&#xA;')" /> 

<xs:template match="/"> 

    <xsl:result-document method="text" href="foo.txt"> 
     <xsl:apply-templates select="Root/a/b/c[contains(., 'foo')]" /> 
    </xsl:reult-document> 

    <xsl:result-document method="text" href="bar.txt"> 
     <xsl:apply-templates select="Root/a/b/c[not(contains(., 'foo'))]" /> 
    </xsl:reult-document> 

</xsl:template> 

<xsl:template match="*"> 
    <xsl:value-of select=concat(normalize-space(.), $break)" /> 
</xsl:template> 

</xsl:stylesheet> 

回答

3

你可以使用一些XSLT 2.0樣式表,如:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="break" select="string('&#xA;')" /> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="Root/a/b/c"/> 
    </xsl:template> 
    <xsl:template match="/Root/a/b/c[contains(., 'foo')]"> 
     <xsl:result-document method="text" href="foo.txt"> 
      <xsl:next-match/> 
     </xsl:result-document> 
    </xsl:template> 
    <xsl:template match="/Root/a/b/c[not(contains(., 'foo'))]"> 
     <xsl:result-document method="text" href="bar.txt"> 
      <xsl:next-match/> 
     </xsl:result-document> 
    </xsl:template> 
    <xsl:template match="*"> 
     <xsl:value-of select="concat(normalize-space(.), $break)" /> 
    </xsl:template> 
</xsl:stylesheet> 

注意:模式匹配和xsl:next-match

+0

+1的一個很好的答案。 – 2011-03-08 04:52:00