XSLT - 在输出中用转义文本替换撇号

3

我正在编写一个XSLT模板,需要为XML站点地图输出一个有效的XML文件。

<url>
<loc>
    <xsl:value-of select="umbraco.library:NiceUrl($node/@id)"/>
</loc>
<lastmod>
    <xsl:value-of select="concat($node/@updateDate,'+00:00')"/>
</lastmod>
</url>

很不幸,输出的Url包含一个撇号 - /what's-new.aspx

我需要将'转义为&apos;以便于Google Sitemap。不幸的是,我尝试的每一种方法都将字符串'&apos;'视为''',这是无效的 - 令人沮丧。XSLT有时会让我发疯。

有什么技巧可以解决吗?(假设我能找到XSLT 1.0模板和函数的方法)

4个回答

9

所以你的输入中有',但你需要在输出中使用字符串&nbsp;

在你的XSL文件中,使用这个查找/替换实现(除非你使用XSLT 2.0),将&apos;替换为&amp;apos;

<xsl:template name="string-replace-all">
  <xsl:param name="text"/>
  <xsl:param name="replace"/>
  <xsl:param name="by"/>
  <xsl:choose>
    <xsl:when test="contains($text,$replace)">
      <xsl:value-of select="substring-before($text,$replace)"/>
      <xsl:value-of select="$by"/>
      <xsl:call-template name="string-replace-all">
        <xsl:with-param name="text" select="substring-after($text,$replace)"/>
        <xsl:with-param name="replace" select="$replace"/>
        <xsl:with-param name="by" select="$by"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$text"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

这样调用:

<loc>
  <xsl:call-template name="string-replace-all">
    <xsl:with-param name="text" select="umbraco.library:NiceUrl($node/@id)"/>
    <xsl:with-param name="replace" select="&apos;"/>
    <xsl:with-param name="by" select="&amp;apos;"/>
  </xsl:call-template>
</loc>

问题是 XSL 将 &apos; 解释为 '。而 &amp;apos; 则会被解释为 &apos;

select="&apos;" 给我一个语法错误:表达式中出现意外的符号 '&'。 -->&<--apos; - East of Nowhere
我遇到了错误:字符串文字未关闭。 -->'<-- - Tom McDonald

1

从您的URL中删除不需要的字符的简单方法是更改umbraco在生成NiceUrl时使用的规则。

编辑config/umbracoSettings.config

添加一个规则,以删除所有撇号(apostrophes)从NiceUrls中,如下所示:

<urlReplacing>
    ...
    <char org="'"></char>     <!-- replace ' with nothing -->
    ...
</urlReplacing>

注意: "org" 属性的内容将被替换为元素的内容,以下是另一个示例:
<char org="+">plus</char> <!-- replace + with the word plus -->

谢谢你的提示。我在本地开发环境中尝试了一下,并发现了一个小的副作用。替换仅适用于在配置更改后发布的节点。任何现有的包含这些字符的节点都需要重新发布-这是一个非常复杂的网站,有许多链接-将不得不添加大量的URL重写规则:( - Neil Fenwick
你可以“重新发布整个站点”(右键单击树视图中的根节点),当然任何已经添加书签的链接都将失效,但内部链接应该会更新。如果这样不起作用,你可能需要进行“硬性重新发布”。 - Myster

0

你尝试过将 disable-output-escaping 设置为“是”,用于你的 xsl:value-of 元素吗?

<xsl:value-of disable-output-escaping="yes" select="umbraco.library:NiceUrl($node/@id)"/>

实际上 - 这可能是你想要的相反。

将xsl:value-of包装在xsl:text元素中怎么样?

<xsl:text><xsl:value-of select="umbraco.library:NiceUrl($node/@id)"/></xsl:text>

也许你应该尝试将'翻译为&amp;apos;


谢谢,我尝试过了,并且结合声明一个名为$apos的变量并赋值为',然后尝试使用replace函数将$apos替换为''' - 不幸的是,XSLT将'''解释为''',这又是一个未关闭的引号 - 哎呀。 - Neil Fenwick

0

这个会起作用的,你只需要按照下面给出的方式更改两个参数

<xsl:with-param name="replace">&apos;</xsl:with-param>
<xsl:with-param name="by" >AnyString</xsl:with-param>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接