XSLT 1.0使用命名模板编译错误

时间:2014-09-04 16:00:12

标签: xml xslt-1.0 msxml6

我正在尝试使用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个字符。

1 个答案:

答案 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>&lt;&lt;&lt;&#10;</xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

在以下XML文档上运行时

<root>
  <num>   </num>
  <num>0123  456 7890   </num>
  <num>&#9;212-345 6789</num><!-- &#9; is a tab character -->
  <num/>
</root>

产生正确的结果

>>>                            <<<
>>>                 01234567890<<<
>>>                 212-3456789<<<
>>>                            <<<

特别是空元素会产生正确长度的完整空白字符串。