6

我在模式(Tridion 2011 SP1)中有一个富文本字段,附加了一个基本的 XSLT 过滤器(默认的 XSLT 或自定义的,对于这个问题并不重要)。

在 IE9 中,当我基于该架构创建组件时,源选项卡中的 XHTML 呈现良好,没有任何命名空间,例如:

<p>a paragraph</p>
<p>
    <a href="http://www.sdltridion.com">a link</a>
</p>

我能够保存组件。

但在 Firefox(16.0.2,不支持)中,名称空间会在 Source 选项卡中呈现:

<p xmlns="http://www.w3.org/1999/XSL/Transform">a paragraph</p>
<p xmlns="http://www.w3.org/1999/XSL/Transform">
    <a href="http://www.sdltridion.com">a link</a>
</p>

这会导致以下 XML 验证错误:

命名空间“http://www.yme.com/GeneralContent”中的元素“段落”在命名空间“http://www.w3.org/1999/XSL/Transform”中具有无效的子元素“p”。预期的可能元素列表:命名空间“http://www.w3.org/1999/xhtml”中的任何元素..

现在我知道它是一个不受支持的 Firefox 版本,但是这个命名空间是从哪里来的呢?Richtext XSLT 中定义的命名空间是http://www.w3.org/1999/XSL/Transform...

有人知道可能的解决方法吗?

这是过滤 XSLT,但正如我已经说过的,默认 XSLT 也会发生这种情况:

<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">
    <output omit-xml-declaration="yes" method="xml" cdata-section-elements="script"></output>
    <template match="/ | node() | @*">
        <copy>
            <apply-templates select="node() | @*"></apply-templates>
        </copy>
    </template>
    <template match="*[(self::br or self::p or self::div) and normalize-space(translate(., &apos; &apos;, &apos;&apos;)) = &apos;&apos; and not(@*)     and      not(processing-instruction()) and not(comment()) and not(*[not(self::br) or @* or * or node()]) and not(following::node()[not((self::text() or self::br or self::p or self::div) and normalize-space(translate(., &apos; &apos;, &apos;&apos;)) = &apos;&apos;        and         not(@*) and not(processing-instruction()) and not(comment())        and         not(*[not(self::br) or @* or * or node()]))])]">
    </template>
    <template match="br[parent::div and not(preceding-sibling::node()) and not(following-sibling::node())]">
        <text></text>
    </template>
    <template match="table|td|tr|th|tbody|p|div|a">
        <element name="{name()}">
            <choose>
                <when test="name() =&apos;img&apos;">
                    <for-each select="@*">
                        <attribute name="{name()}">
                            <value-of select="."></value-of>
                        </attribute>
                    </for-each>
                </when>
                <otherwise>
                    <for-each select="@*">
                        <choose>
                            <when test="name() =&apos;border&apos;"></when>
                            <when test="name() =&apos;cellpadding&apos;"></when>
                            <when test="name() =&apos;cellspacing&apos;"></when>
                            <when test="name() =&apos;bgcolor&apos;"></when>
                            <when test="name() =&apos;bordercolor&apos;"></when>
                            <when test="name() =&apos;width&apos;"></when>
                            <when test="name() =&apos;height&apos;"></when>
                            <when test="name() =&apos;bordercolor&apos;"></when>
                            <when test="name() =&apos;span&apos;"></when>
                            <when test="name() =&apos;style&apos;"></when>
                            <when test="name() =&apos;class&apos;">
                                <choose>
                                    <when test=". =&apos;MsoNormal&apos;"></when>
                                    <otherwise>
                                        <attribute name="{name()}">
                                            <value-of select="."></value-of>
                                        </attribute>
                                    </otherwise>
                                </choose>
                            </when>
                            <otherwise>
                                <attribute name="{name()}">
                                    <value-of select="."></value-of>
                                </attribute>
                            </otherwise>
                        </choose>
                    </for-each>
                </otherwise>
            </choose>
            <apply-templates></apply-templates>
        </element>
    </template>
    <template match="h1">
        <element name="h2">
            <apply-templates></apply-templates>
        </element>
    </template>
    <template match="td/p">
        <apply-templates></apply-templates>
    </template>
    <template match="li/p">
        <apply-templates></apply-templates>
    </template>
    <template match="link|script|font|iframe|ilayer|layer|span|small">
        <apply-templates></apply-templates>
    </template>
</stylesheet>
4

2 回答 2

6

我相信这个问题与这篇文章有关

Tridion 2011 - 在 Formatting Feature 窗口中过滤 XSLT

似乎迁移过程(或者可能是奇怪的 GUI 行为)正在改变过滤 XSLT,并且似乎影响了 RTF 字段的行为。基本上,在 XSLT 中使用名称空间和名称空间前缀的方式似乎已经改变。典型的 XSLT 使用xsl名称空间前缀,而您的新 XSLT 似乎排除了前缀并使用默认名称空间。

我认为这是一个错误,应该提交给支持人员,但解决方法已在相关帖子中介绍。

于 2012-11-13T15:15:57.677 回答
3

好吧,您的样式表具有<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">并且确实意味着它接受输入<element name="{name()}">(等)元素并将它们转换为具有相同名称(例如)但在 XSLT 名称空间中的元素。<template match="table|td|tr|th|tbody|p|div|a">ptablep

因此,您可能想要的是编写带有前缀(即<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="table|td|tr|th|tbody|p|div|a">)的 XSLT 代码,以便 XSLT 名称空间不会干扰您要创建的结果元素。

另一方面,替换 <element name="{name()}"><xsl:copy>也应该这样做。

于 2012-11-13T15:19:36.340 回答