2

我有一个通过基于 java 的系统处理的 xml。

如果 xml 上的任何节点包含空格,则该进程将挂起或出错。

所以如果我有这个例子,我怎样才能消除文本节点周围的空格?

重要的是要提到这个 xpath 应该是“动态的”,所以如果 xml 发生变化,它仍然会捕获那些空间。

 <bookstore>
    <book category="cooking">
        <title lang="en"> Everyday Italian</title>
        <author>Giada De Laurentiis </author>
        <year> 2005 </year>
    </book>
</bookstore>
4

1 回答 1

1

使用 XPath 并检索其值的任何地方,使用normalize-space(YOUREXPR),在哪里YOUREXPR是返回空格的当前表达式。

它将消除尾随和前导空格,并将折叠任何重复的空格。

或者,既然您说“如果 xml 上的任何节点包含空格,则该进程将挂起或出错。” ,您可以使用 完全删除所有空格,translate(YOUREXPR, ' ', '')这将变成Everyday ItalianEverydayItalian

如果您还想消除换行符和制表符,您可以使用

translate(YOUREXPR, ' &#x9;&#xA;&#xD;', '')

更新:根据您的评论,您似乎真的想从过多的空间中清除文件。在这种情况下,您应该使用 XSLT。类似以下内容将创建文件副本,其中删除文本节点和属性节点中的所有多余空格(未经测试,但有效,如果您是 XSLT 新手,我建议您通过许多教程或书籍中的任何一个来阅读它):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

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

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

    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}" namespace="{namespace-uri()}">
            <xsl:value-of select="normalize-space(.)" />
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="text()">
        <xsl:value-of select="normalize-space(.)" />
    </xsl:template>
</xsl:template>
于 2015-09-22T22:39:47.300 回答