Ошибка компиляции XSLT 1.0 с именованным шаблоном

Я пытаюсь решить проблему с пространством с элементами номера телефона и факса в моем XML.

Элементы:

<PhoneNumber>0870 6071352</PhoneNumber>
<FaxNumber>01722 422301</FaxNumber>

но они также могут быть:

0870 6071352

поэтому мне нужно удалить начальные и конечные пробелы, сохранить пробел между любыми числами и вывести результат, отформатированный до фиксированной длины в 71 символ, используя начальные пробелы.

поэтому я пытаюсь написать именованный шаблон, который удалит пробелы, а затем дополнит вывод начальными пробелами до фиксированной длины 71 символа.

вот мой определенный шаблон, но он не компилируется - я получаю сообщение об ошибке Ожидается выражение ‹- и не могу понять, что отсутствует или неправильно

<!-- 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 персонажи.


person Our Man in Bananas    schedule 04.09.2014    source источник


Ответы (1)


Удалите строку:

<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<<<
>>>                            <<<

В частности, пустые элементы создают полностью пустые строки правильной длины.

person Ian Roberts    schedule 04.09.2014
comment
спасибо, но когда я использую translate, когда элемент пуст, я получаю неполную строку - person Our Man in Bananas; 04.09.2014
comment
как я могу сохранить пробел в 020 123456, но потерять все конечные и начальные пробелы, а также вывести правильную длину в 71 символ, даже если он пуст? - person Our Man in Bananas; 04.09.2014
comment
@Philip Филипп, я не могу воспроизвести вашу проблему - когда я тестирую свой шаблон с пустым строковым значением для $text, я получаю правильный вывод из 71 пробела. - person Ian Roberts; 04.09.2014
comment
@Philip Если вы хотите потерять начальные и конечные пробелы, но сохранить внутренние пробелы, вы можете использовать только normalize-space без translate. Функция normalize-space удаляет начальные и конечные пробелы и преобразует любые внутренние последовательности одного или нескольких символов пробела в один пробел. - person Ian Roberts; 04.09.2014