Функция Xpath для удаления пробела

Im пытается использовать функции 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">

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

союзник

2 ответов


как указывает Тим Робинсон,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 - сделать код более читаемым (как в приведенном выше примере) или сохранить промежуточные результаты, которые иначе не могут быть эффективно вычислены. Четвертый способ получения данных в выходные данные-это тот, о котором вы не упоминали, и это очень полезно: шаблон значения атрибута. Все они делают одно и то же:--7-->

<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, которые делают то же самое.


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

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