xpath: Trim 个节点中的空格

xpath: Trim spaces in a node

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

如果 xml 上的任何节点包含 space 进程将挂起或出错。

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

重要的是要提到这个 xpath 应该是 "dinamic" 所以如果 xml 改变它仍然会捕获那些 spaces.

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

在您使用 XPath 并检索其值的任何地方,请使用 normalize-space(YOUREXPR),其中 YOUREXPR 是您当前表达式的 returns 个空格。

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

或者,既然你说 "if any node on the xml contains a space the process will hang or error out.",你可以使用 translate(YOUREXPR, ' ', '') 完全删除所有空格,这将在 EverydayItalian.

如果你还想去掉换行符和制表符,可以使用

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>