xml内容:每个条目一行

时间:2013-06-25 14:36:29

标签: xml xslt

我有一个XML:

<root>

<entry id="1">
<content>TEXT</content>
</entry>

<entry id="2">
<content>TEXT</content>
</entry>

<entry id="3">
<content>TEXT</content>
</entry>

<root>

我如何转换它(使用xslt)以便在1行上拥有所有“条目”,例如:

<root>

<entry id="1"><content>TEXT</content></entry>
<entry id="2"><content>TEXT</content></entry>
<entry id="3"><content>TEXT</content></entry>

<root>

感谢您的想法

2 个答案:

答案 0 :(得分:1)

正如我在上面的评论中所说,XML布局对你来说无关紧要。任何使用XML的应用程序都应该只关心DOM树,而不关心XML源布局。添加或删除无关紧要的空白区域不得破坏任何内容或改变任何行为。

如果你真的那么肯定,那么你可以使用

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

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

    <xsl:template match="entry/text()[normalize-space() = '']" />
    <xsl:template match="text()[
        normalize-space() = '' 
        and preceding-sibling::*[1][self::entry]
        and following-sibling::*[1][self::entry]
    ]">
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>

</xsl:stylesheet>

虽然这会生成所需的XML,但它实际上是一个无用的无操作,只有学术价值,显示了一些你可以用XPath做的事情。请不要实际这样做。

答案 1 :(得分:1)

最简单的方法可能就是使用xsl:strip-spaces指令从传入的XML文档中去除空格:

<xsl:stylesheet version="2.0"    
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:saxon="http://saxon.sf.net/" 
    exclude-result-prefixes="xs saxon"    >

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

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

</xsl:stylesheet>

这种工作原理将取决于您如何序列化输出XML。