XSLT: Как использовать текстовый узел дважды? Один раз с пробелами И снова без пробелов? - PullRequest
3 голосов
/ 09 августа 2011

Я использую этот шаблон для генерации списка внутренних ссылок на различные разделы, на которые ссылается "id = '{title}" в xHTML-документе.

<xsl:template match="folder/folder" mode="folderlist">
    <li>[<a href="#{title}"><xsl:value-of select="title" /></a>]</li>
</xsl:template>

Это работает, но, конечно, не проверяетпотому что содержимое 'title' может содержать слова, а правило гласит, что у "id" не может быть пробела.

Предположим, что содержимое {title}: 'Title with space'.

То, чего я пытаюсь добиться, - это удалить пробел (ы) из содержимого {title} для вставки только в href =, чтобы результат выглядел следующим образом:

<a href="Titlewithspaces">

и затем каким-то образомиспользуйте исходное содержимое {title} еще раз, чтобы полная результирующая строка стала такой:

<li>[<a href="#Titlewithspaces">Title with spaces</a>]</li>

Возможно ли это вообще? Если да, может кто-нибудь сказать мне, как этого добиться? Спасибо.

Ответы [ 3 ]

2 голосов
/ 09 августа 2011

Общее решение (как XPath 1.0, так и XPath 2.0 - соответственно XSLT 1.0 и XSLT 2.0), когда мы хотим заменить любой не алфавитно-цифровой символ, скажем, подчеркиванием :

<a href="#{translate(., translate(.,$vAlphaNum,''), '_')}">

, где переменная vAlphaNum определяется как строка, содержащая все буквы (A-Z и a-z) и все цифры (0-9).

Это так называемый «метод двойного перевода», впервые предложенный @Michael Kay.

1 голос
/ 09 августа 2011

Вы можете использовать функцию normalize-space(), чтобы избавиться от начальных / конечных пробелов и свести все повторяющиеся пробелы в один, а затем использовать функцию translate(), чтобы заменить оставшиеся пробелы ничем.

translate(normalize-space(title),' ',''))

Применение его к вашему примеру шаблона:

<xsl:template match="folder/folder" mode="folderlist">
    <li>[<a href="#{translate(normalize-space(title),' ','')}">
    <xsl:value-of select="title" /></a>]</li>
</xsl:template>
1 голос
/ 09 августа 2011

Вы можете использовать функцию translate():

    translate(title, '&#x20;&#x9;&#xD;&#xA;', '')

Применение ее к вашему примеру шаблона:

<xsl:template match="folder/folder" mode="folderlist">
    <li>[<a href="#{translate(title, '&#x20;&#x9;&#xD;&#xA;', '')}">
    <xsl:value-of select="title" /></a>]</li>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...