2013-10-26 95 views
0

您好,我有一個問題涉及到使用XSLT將輸入XML轉換爲輸出XML,並刪除僅用於某些元素的換行符和縮進。使用XSLT將XML轉換爲XML並刪除特定元素的換行符

我想說明我的問題:

輸入:

<LISTESTOF> 
    <ICSGROUP> 
    <ICSNUM>1</ICSNUM> 
    <ICSDKNAME>A1</ICSDKNAME> 
    <ICSUKNAME>B2</ICSUKNAME> 
    </ICSGROUP> 
    <ICSGROUP> 
    <ICSNUM>2</ICSNUM> 
    <ICSDKNAME>B1</ICSDKNAME> 
    <ICSUKNAME>B2</ICSUKNAME> 
    </ICSGROUP> 
</LISTESTOF> 

輸出:

<LISTESTOF> 
<ICSGROUP><ICSNUM>1</ICSNUM> 
<ICSDKNAME>A1</ICSDKNAME> 
<ICSUKNAME>B2</ICSUKNAME></ICSGROUP> 
<ICSGROUP><ICSNUM>2</ICSNUM> 
<ICSDKNAME>B1</ICSDKNAME> 
<ICSUKNAME>B2</ICSUKNAME></ICSGROUP> 
</LISTESTOF> 

我的XSLT到目前爲止文件:

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

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="LISTESTOF"> 
      <xsl:value-of select="'&#xA;'" /><LISTESTOF><xsl:apply-templates select="ICSGROUP"/></LISTESTOF> 
    </xsl:template> 

    <xsl:template match="ICSGROUP"> 
       <xsl:value-of select="'&#xA;'" /><ICSGROUP><xsl:apply-templates select="ICSNUM"/><xsl:value-of select="'&#xA;'" /><xsl:apply-templates select="ICSDKNAME"/><xsl:value-of select="'&#xA;'" /><xsl:apply-templates select="ICSUKNAME"/></ICSGROUP> 
    </xsl:template> 

    <xsl:template match="ICSNUM"> 
     <ICSNUM><xsl:value-of select="."/></ICSNUM> 
    </xsl:template> 

    <xsl:template match="ICSDKNAME"> 
     <ICSDKNAME><xsl:value-of select="."/></ICSDKNAME> 
    </xsl:template> 

    <xsl:template match="ICSUKNAME"> 
     <ICSUKNAME><xsl:value-of select="."/></ICSUKNAME> 
    </xsl:template> 


    </xsl:stylesheet> 

是否有清潔解決方案未定義的元素會發生什麼?他們會消失嗎?有什麼建議麼?先謝謝你!

+2

可能更容易使用專用的漂亮的打印機,如http://www.kitebird.com/軟件/ xmlformat /。 – mzjn

+0

你說得對,它會容易得多。但是我的客戶不想使用外部軟件來將他的XML數據導入到InDesign文檔中。 InDesign具有在導入過程中使用外部xslt文件來轉換input-xml的功能。所以我不知何故鎖定了xslt語言及其可能性:( –

回答

3

我會通過刪除啓動所有只有空白文本節點

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

然後有一個身份模板從輸入的所有內容複製到產量不變(空格剝離後),除非另有規定

<xsl:template match="@*|node()" name="ident"> 
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> 
</xsl:template> 

現在爲你想要的元素添加特定模板先於換行

<xsl:template match="ICSGROUP|ICSDKNAME|ICSUKNAME"> 
    <xsl:text>&#xa;</xsl:text> 
    <xsl:call-template name="ident"/> 
</xsl:template> 

和特殊的一個LISTESTOF的結束標記前添加一個額外的換行符

<xsl:template match="LISTESTOF"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    <xsl:text>&#xa;</xsl:text> 
    </xsl:copy> 
</xsl:template> 
+0

完美的解決方案!謝謝:) –