XSLT 1.0删除前导和尾随空格

时间:2019-02-21 03:15:53

标签: xslt trim

我必须使用XSL 1.0删除前导空格和尾随空格

不能为此使用规范化空间。

并尝试了以下代码

<xsl:template match="text()">
<xsl:value-of select="replace(.,'^\s+|\s+$','')"/>
</xsl:template>

在开始实际映射的命令之前

但无济于事

如何实现?

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是使用normalize-space() 功能(甚至在 XSLT 1.0 中也可以使用)。

它的功能甚至更多,例如,它替换了内部的多个白色字符 单个空格。

要将其应用于所有文本节点,请添加这样的模板:

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

但是如果您还有 identity模板,则上面的模板 必须在身份模板之后之后的脚本中。

答案 1 :(得分:0)

好吧,在 XSLT 1.0 中,您可以使用递归模板(不太推荐)方法来删除前导空格和尾随空格(如果您不想使用normalize-space()

让我们假设您的输入如下:

<?xml version="1.0" encoding="UTF-8"?>
<body>
    <h1>                A text having so many leading and trailing spaces!           </h1>
</body>

注意:以下解决方案使用xmlns:str="xalan://org.apache.commons.lang.StringUtils"来使用它的两个功能ends-withsubstringBeforeLast

用于完成任务的XSLT 1.0解决方案:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="xalan://org.apache.commons.lang.StringUtils" 
exclude-result-prefixes="str">
<xsl:output method="xml" indent="yes" />

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

<xsl:template match="h1">
    <h1>
        <xsl:variable name="leadingSpaceRemoved">
            <xsl:call-template name="removeLeadingSpace">
                <xsl:with-param name="text" select="." />
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="trailingSpaceRemoved">
            <xsl:call-template name="removeTrailingSpace">
                <xsl:with-param name="text" select="$leadingSpaceRemoved" />
            </xsl:call-template>
        </xsl:variable>

        <xsl:value-of select="$trailingSpaceRemoved" />
    </h1>
</xsl:template>

<xsl:template name="removeLeadingSpace">
    <xsl:param name="text" />

    <xsl:variable name="h1" select="$text" />
    <xsl:choose>
        <xsl:when test="starts-with($h1,' ')">
            <xsl:call-template name="removeLeadingSpace">
                <xsl:with-param name="text" select="substring-after($h1,' ')" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$h1" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template name="removeTrailingSpace">
    <xsl:param name="text" />

    <xsl:variable name="h1" select="$text" />
    <xsl:choose>
        <xsl:when test="str:ends-with($h1,' ')">
            <xsl:call-template name="removeTrailingSpace">
                <xsl:with-param name="text" select="str:substringBeforeLast($h1,' ')" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$h1" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

此外,如果您可以在您的环境中调用Java库/类,则实现与以下相同的操作会更容易:

您的XSLT为:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:stringparser="xalan://com.example.commons.xsl.StringUtil"
exclude-result-prefixes="stringparser">

<xsl:output method="xml" indent="yes" />

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

<xsl:template match="h1">
    <h1>
        <xsl:value-of select="stringparser:trim(.)" />
    </h1>
</xsl:template>
</xsl:stylesheet>

StringUtil.java 为:

import org.apache.commons.lang.StringUtils;
public class StringUtil {
/**
 * 
 * @param input
 * @return remove leading and trailing spaces.
 */
public static String trim(final String input) {
    if (StringUtils.isNotBlank(input)) {
        return input.trim();
    }
    return input;
}
}