0

我有一个 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>

谢谢你的想法

4

2 回答 2

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 做的一些事情。请不要真的这样做。

于 2013-06-25T14:55:59.500 回答
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。

于 2013-06-25T15:23:36.227 回答