2013-10-26 102 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

完美的解决方案!谢谢:) –