例如,我有像000 FF0 F4F CV1
这样的输入字符串。此字符串的输出应000FF0F4F CV1
。如您所见,只删除了一个空格字符:如果有一个空格 - 根本没有空格;如果有两个空格 - 一个被删除,一个被留下(如果有三个空格 - 一个被删除,两个被留下,依此类推(。
更多示例:000 FF0 F4F CV1
->000 FF0 F4FCV1
000 FF0 F4F CV1
->000FF0 F4FCV1
现在有指定的输入字符串格式,您不知道空格的长度和数量。唯一的要求是删除一个空格。因此,需要通用解决方案。有没有知道如何使用 XSLT 1.0 实现它?
如果 - 看起来 - 您想从每组连续的空格字符(包括一组 1(中删除一个字符,您可以执行以下操作:
.XML
<root>
<string>000 FF0 F4F CV1</string>
<string>000 FF0 F4F CV1</string>
<string>000 FF0 F4F CV1</string>
</root>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="string">
<xsl:copy>
<xsl:call-template name="process">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="process">
<xsl:param name="text"/>
<xsl:choose>
<xsl:when test="contains($text, ' ')">
<xsl:value-of select="substring-before($text, ' ')"/>
<xsl:variable name="tail" select="substring-after($text, ' ')"/>
<xsl:variable name="first-char" select="substring(normalize-space($tail), 1, 1)" />
<xsl:value-of select="substring-before($tail, $first-char)"/>
<!-- recursive call -->
<xsl:call-template name="process">
<xsl:with-param name="text" select="concat($first-char, substring-after($tail, $first-char))" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
<root>
<string>000FF0F4F CV1</string>
<string>000 FF0 F4FCV1</string>
<string>000FF0 F4FCV1</string>
</root>
请注意,这假定任何一组连续空格字符中的第一个字符是空格。并且字符串不以空格字符结尾。