使用XSLT将XML转换为XML并删除特定元素的换行符
问题描述:
您好,我有一个问题涉及到使用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="'
'" /><LISTESTOF><xsl:apply-templates select="ICSGROUP"/></LISTESTOF>
</xsl:template>
<xsl:template match="ICSGROUP">
<xsl:value-of select="'
'" /><ICSGROUP><xsl:apply-templates select="ICSNUM"/><xsl:value-of select="'
'" /><xsl:apply-templates select="ICSDKNAME"/><xsl:value-of select="'
'" /><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>
是否有清洁解决方案未定义的元素会发生什么?他们会消失吗?有什么建议么?先谢谢你!
答
我会通过删除启动所有只有空白文本节点
<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>
</xsl:text>
<xsl:call-template name="ident"/>
</xsl:template>
和特殊的一个LISTESTOF
的结束标记前添加一个额外的换行符
<xsl:template match="LISTESTOF">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:text>
</xsl:text>
</xsl:copy>
</xsl:template>
+0
完美的解决方案!谢谢:) –
可能更容易使用专用的漂亮的打印机,如http://www.kitebird.com/软件/ xmlformat /。 – mzjn
你说得对,它会容易得多。但是我的客户不想使用外部软件来将他的XML数据导入到InDesign文档中。 InDesign具有在导入过程中使用外部xslt文件来转换input-xml的功能。所以我不知何故锁定了xslt语言及其可能性:( –