XSLT - 如何修剪xsl:value-of表达式中的所有值

时间:2013-04-25 16:11:20

标签: xml xslt

我有许多 xsl:value-of 调用的XSLT代码。我需要修剪所有值中的空格。
每次调用都非常繁琐地写normalize-space() 我用模板:

<xsl:template match="text()">
    <xsl:value-of select="normalize-space(.)"/>
</xsl:template>

但它没有效果。
谢谢!
抱歉我的英文。

2 个答案:

答案 0 :(得分:2)

更新:我认为@Michael Kay的答案最有可能是你想要的。

  • strip-space elements="*"仅删除带有空白文本的节点
  • 如果您只想获取没有空格的值,则不需要构建中间节点集。
  • 如果您必须测试(<xsl:if test=)项目的抢劫并且希望避免在测试条件中normalize-space,那么使用下面的“中间节点集”解决方案可能只有一个原因

以下原始答案

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

应该有所帮助。 (就在您的xlst的顶层。)

更新(下次尝试;-)) 您可以使用exsl:node-set。

构建一个没有空格的中间节点集
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:exsl="http://exslt.org/common"
            extension-element-prefixes="exsl">

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*" />

    <xsl:template match="/">
        <xsl:variable name="intermediate">
            <xsl:apply-templates mode="ws_remove"/>
        </xsl:variable>
        <xsl:apply-templates select="exsl:node-set($intermediate)/*"/>

    </xsl:template>

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

    </xsl:template>
        <xsl:template match="text()" mode="ws_remove" >
            <xsl:value-of select="normalize-space(.)"/>
        </xsl:template>

    <xsl:template match ="root">
        <test>
            <xsl:value-of select="test"/>
        </test>
    </xsl:template>
</xsl:stylesheet>

使用此输入

<root>
    <test> adfd   das    </test>
</root>

生成此输出:

 <test>adfd das</test>

答案 1 :(得分:2)

将normalize-space()调用放在文本节点的模板规则中不起作用,因为xsl:value-of不应用模板规则。如果您将<xsl:value-of select="."/>更改为<xsl:apply-templates/>(无处不在),则可以正常使用。