Функция Xpath для удаления пробелов - PullRequest
7 голосов
/ 05 декабря 2009

Я пытаюсь использовать функции XSL и Xpath, чтобы удалить все пробелы из атрибута XML с именем name и сделать его строчным. На данный момент у меня есть что-то вроде

 <xsl:variable name="linkName">
 <xsl:value-of select="normalize-space(name)"/>
 </xsl:variable>

Это удаляет пробел в начале и в конце, но не в середине. Есть предложения?

Какова лучшая практика для обработки и изменения данных XML, так как кажется, что вы можете использовать

<xsl:value-of select="x"/>  

помещается прямо в HTML

или

<xsl:attribute name="y">
<xsl:value-of select="x"/>

или используйте

<xsl:variable name="x">

Я не совсем уверен в различиях или когда каждый должен быть использован. Любая помощь очень ценится.

Ally

Ответы [ 2 ]

6 голосов
/ 05 декабря 2009

Как отмечает Тим ​​Робинсон, translate сделает свое дело. (Я бы не назвал это «взломом», но тогда я уже давно нахожусь на стадии «отождествление с моими пытателями» в моих отношениях с XSLT.) Ваш код будет намного более читабельным, если вы будете использовать что-то подобное :

<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/>
<xsl:variable name="ws" value=" &#13;&#10;&#09"/>

... который является частью файла globals.xslt, который я включаю в начало большинства преобразований, которые я пишу. Тогда это:

<xsl:value-of select="translate(x, concat($uc, $ws), $lc)"/>

переводит каждую заглавную букву в ее строчный эквивалент, а каждый символ пробела - в ничто.

Обычно причина, по которой вы используете xsl:variable, состоит в том, чтобы сделать код более читабельным (как в приведенном выше примере) или сохранить промежуточные результаты, которые иначе невозможно эффективно рассчитать. Четвертый способ получения данных на выходе - это тот, который вы не упомянули, и это чертовски полезно: шаблон значения атрибута. Все они делают одно и то же:

<link>
   <xsl:attribute name="name">
      <xsl:value-of select="translate(name, concat($uc, $ws), $lc)"/>
   </xsl:attribute>
</link>

<link>
    <xsl:attribute name="name" value="translate(name, concat($uc, $ws), $lc)"/>
</link>

<xsl:variable name="linkName" value="translate(name, concat($uc, $ws), $lc)"/>
<link name="{$linkName}"/>

В данном конкретном случае можно утверждать, что из двух последних проще и понятнее. Однако в большинстве случаев это не так: отделение вычисления значений от того, как они вставляются в вывод, облегчает понимание обоих, как и использование AVT вместо более многословных конструкций XSLT, которые делают то же самое.

3 голосов
/ 05 декабря 2009

Это удаляет пробел в начале и в конце, но не в середине. Есть предложения?

Вы можете использовать translate(' &#13;&#10;', '') для удаления пробелов, символов новой строки и возврата каретки. Если вы используете классы .NET или MSXSL для преобразования, то немного сложнее превратить символы в нижний регистр. Один хак, который я использовал, - это использование transform, чтобы превратить буквы в верхнем и нижнем регистре; другое - написать объект расширения .NET для обеспечения функции lower-case. Функция lower-case встроена в XPath / XSL 2.0.

Во второй части вашего вопроса они делают разные вещи:

  • <xsl:value-of ... помещает значение непосредственно в HTML
  • <xsl:attribute ... создает атрибут для текущего элемента HTML и присваивает ему значение
  • <xsl:variable ... объявляет переменную XSL без влияния на HTML. Вы можете записать эту переменную в HTML, используя <xsl:value-of select="$x"/>.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...