我正在尝试使用XML中的电话号码和faxNumber元素处理空间问题。
元素是:
<PhoneNumber>0870 6071352</PhoneNumber>
<FaxNumber>01722 422301</FaxNumber>
但他们也可以:
0870 6071352
所以我需要删除前导和尾随空格,保留任何数字之间的空格,并使用前导空格将结果格式化为71个字符的固定长度。
所以我正在尝试编写一个命名模板,该模板将删除空格,然后使用前导空格填充输出,固定长度为71个字符。
这是我定义的模板,但它没有编译 - 我得到一个错误表达式预期&lt; - 我无法找出遗漏或错误的内容
<!-- format the phone number with no spaces and output to 71 characters with leading spaces -->
<xsl:template name="FormattedPhoneFaxNumber">
<xsl:param name="text"/>
<xsl:choose>
<xsl:when test="contains($text,' ')">
<xsl:value-of select="substring-before($text,' ')"/>
<xsl:value-of select=""/>
<xsl:call-template name="FormattedPhoneFaxNumber">
<xsl:with-param name="text" select="substring-after($text,' ')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring(concat(' ', $text), 1, 71)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
任何人都可以告诉我哪里出错了吗?
我需要这样做的原因是因为我必须处理元素为空,具有前导或尾随空格以及值或仅仅是值,并且我们需要输出两个具有前导空格的文件到最大值长度为71个字符。
答案 0 :(得分:2)
删除该行:
<xsl:value-of select=""/>
select
属性应该是XPath表达式,空字符串不是有效表达式。
但是你根本不需要递归模板,如果你想从字符串中删除空格,你可以使用translate(theString, ' ', '')
来删除它,你可能想要添加一个normalize-space
来处理其他空白字符,如标签。例如,以下样式表
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" />
<xsl:template name="FormattedPhoneFaxNumber">
<xsl:param name="text"/>
<xsl:variable name="noSpaces" select="translate(normalize-space($text), ' ', '')" />
<!-- using fewer spaces for this example, but in your real case use 71 -->
<xsl:value-of select="substring(concat(' ',
$noSpaces), string-length($noSpaces) + 1)"/>
</xsl:template>
<xsl:template match="/">
<xsl:for-each select="*/*">
<xsl:text>>>></xsl:text>
<xsl:call-template name="FormattedPhoneFaxNumber">
<xsl:with-param name="text" select="." />
</xsl:call-template>
<xsl:text><<< </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
在以下XML文档上运行时
<root>
<num> </num>
<num>0123 456 7890 </num>
<num>	212-345 6789</num><!-- 	 is a tab character -->
<num/>
</root>
产生正确的结果
>>> <<<
>>> 01234567890<<<
>>> 212-3456789<<<
>>> <<<
特别是空元素会产生正确长度的完整空白字符串。