2011-12-22 32 views
1

我想在xml中遍歷所有節點和子節點(遞歸)並將元素轉換爲txt格式。 E.g:使用xslt將所有xml元素轉換爲txt

<root> 
    <level> 
    <data1>data1</data1> 
    <sublevel> 
     <data2>data2</data2> 
    </sublevel> 
    </level> 
</root> 

我想txt格式的輸出如下:

root 
    level 
    data1:data1 
    sublevel 
     data2:data2 

我目前的XSLT transormation是:

<xsl:strip-space elements="*" /> 

<xsl:template match="/"> 
    <xsl:for-each select="*"> 
    <xsl:value-of select="local-name()"/>: <xsl:value-of select="."/><xsl:text>&#xa;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

,但它不產生所需的輸出。有一些錯誤:

  • 的元素的名稱僅針對根節點轉化
  • 有如果存在空元素(我想抑制空行)

感謝

空行

回答

0

用途:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="*"> 
     <xsl:value-of select="local-name()"/> 

     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="text()[normalize-space(.)]"> 
     <xsl:value-of select="concat(':', .)"/> 
    </xsl:template> 
</xsl:stylesheet> 

MSXSL輸出:

root 
    level 
     data1:data1 
     sublevel 
      data2:data2 
+0

感謝基里爾,您的解決方案看起來不錯,但我需要格式化輸出(這是另一個要求)。輸出的txt應該與輸入的xml保持一致(請參閱我的問題:txt輸出表示形式)。您示例中的輸出全部被推入一行。你能告訴我如何格式化輸出嗎?謝謝。 – zosim 2011-12-22 10:14:39

+0

@zosim,我已經更新了我的答案。 – 2011-12-22 10:26:52

+0

@zosim,不要設置'' – 2011-12-22 10:27:38

0

嘗試更換:

xsl:value-of select="local-name()" 

xsl:value-of select="text()" 

可以測試空值與if

<if test="text() = '' > 

我沒有測試的代碼,但應該給你一個想法。

0

下面可能是一個好推到正確的方向:輸出需要縮進和子元素,不輸出 - 但我猜你將能夠弄清楚:-)。

<xsl:template match="/root"> 
    <xsl:call-template name="nodeToText"/> 
</xsl:template> 

<xsl:template name="nodeToText"> 
    <xsl:value-of select="local-name()"/>: <xsl:value-of select="."/><xsl:text>&#xa;</xsl:text> 
    <xsl:for-each select="child::*"> 
     <xsl:call-template name="nodeToText"/> 
    </xsl:for-each> 
</xsl:template> 

這導致了以下的輸出:

root: data1data2 
level: data1data2 
data1: data1 
sublevel: data2 
data2: data2 
+0

謝謝,最後我用了Kirill的解決方案。 – zosim 2011-12-22 11:34:19