XSLT - 将输出中的撇号替换为转义文本

发布于 2024-07-26 17:58:06 字数 533 浏览 3 评论 0原文

我正在编写一个 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

我需要将 ' 转义为 google Sitemap 的 &apos;。 不幸的是,我尝试的每一次尝试都将字符串“&apos;”视为无效的“”,这令人沮丧。 XSLT 有时会让我发疯。

对技术有什么想法吗? (假设我可以找到 XSLT 1.0 模板和函数的方法)

I'm writing an XSLT template that need to output a valid xml file for an xml Sitemap.

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

Unfortunately, Url that is output contains an apostrophe - /what's-new.aspx

I need to escape the ' to ' for google Sitemap. Unfortunately every attempt I've tried treats the string ''' as if it was ''' which is invalid - frustrating. XSLT can drive me mad sometimes.

Any ideas for a technique? (Assume I can find my way around XSLT 1.0 templates and functions)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

贩梦商人 2024-08-02 17:58:06

那么您的输入中有 ',但输出中需要字符串  

在您的 XSL 文件中,使用 此查找/替换实现(除非您使用的是 XSLT 2.0):

<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="'"/>
    <xsl:with-param name="by" select="&apos;"/>
  </xsl:call-template>
</loc>

问题是 ' 由 XSL 解释为 '&apos; 将被解释为 '

So you have ' in your input, but you need the string   in your output?

In your XSL file, replace ' with &apos;, using this find/replace implementation (unless you are using XSLT 2.0):

<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>

Call it this way:

<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="'"/>
    <xsl:with-param name="by" select="&apos;"/>
  </xsl:call-template>
</loc>

The problem is ' is interpreted by XSL as '. &apos; will be interpreted as '.

对不⑦ 2024-08-02 17:58:06

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

编辑 config/umbracoSettings.config

添加一条规则,从 NiceUrls 中删除所有撇号,如下所示:

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

注意:“org”属性的内容将替换为元素的内容,这是另一个示例:

<char org="+">plus</char> <!-- replace + with the word plus -->

The simple way to remove unwanted characters from your URL is to change the rules umbraco uses when it generates the NiceUrl.

Edit the config/umbracoSettings.config

add a rule to remove all apostrophes from NiceUrls like so:

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

Note: The contents of the "org" attribute is replaced with the contents of the element, here's another example:

<char org="+">plus</char> <!-- replace + with the word plus -->
染墨丶若流云 2024-08-02 17:58:06

这将起作用,您只需要更改两个参数,如下所示

<xsl:with-param name="replace">'</xsl:with-param>
<xsl:with-param name="by" >AnyString</xsl:with-param>

This will work, you just need to change TWO params as given below

<xsl:with-param name="replace">'</xsl:with-param>
<xsl:with-param name="by" >AnyString</xsl:with-param>
蓝眼睛不忧郁 2024-08-02 17:58:06

您是否尝试过将 xsl 的 disable-output-escaping 设置为 yes :value-of element:

<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>

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

Have you tried setting disable-output-escaping to yes for your xsl:value-of element:

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

Actually - this is probably the opposite of what you want.

How about wrapping the xsl:value-of in an xsl:text element?

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

Perhaps you should try to translate ' to &apos;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文