Функция 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=" 	"/>
...которая является частью 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(' ', '')
на полосу пространства, символы новой строки и возврата каретки. Если вы используете классы .NET или MSXSL для преобразования, то немного сложно превратить символы в нижний регистр. Один хак, который я использовал, - использовать transform
чтобы превратить прописные буквы в их строчные аналоги; другой-написать объект расширения .NET обеспечить