XSLT:如何使用文本节点两次?一次与Spaces AND再次没有空格?

时间:2011-08-09 00:30:13

标签: xml templates xslt text

我使用此模板生成xHTML-doc中“id ='{title}'引用的各个部分的内部链接列表。

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

它有效,但当然不会验证,因为'title'的内容可能包含sapces,规则说“id”不能有空格。

我们假设{title}的内容是:'带空格的标题'。

我想要实现的是从{title}的内容中删除要插入到href =中的空格,以便结果如下所示:

<a href="Titlewithspaces">

然后以某种方式再次使用{title}的原始内容,因此完整的结果行变为:

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

这有可能吗?如果是这样,有人可以告诉我如何实现这一目标吗? 感谢。

3 个答案:

答案 0 :(得分:2)

一个通用的解决方案(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 :(得分:1)

您可以使用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>

答案 2 :(得分:1)

您可以使用normalize-space()函数删除前导/尾随空格并将任何重复的空白字符折叠为单个空格,然后使用translate()函数替换任何剩余空格。< / p>

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>