我在架构中有一个richtext字段(Tridion 2011 SP1),附带了一个基本的XSLT过滤器(默认的XSLT或自定义的XSLT,对于这个问题无关紧要)。
在IE9中,当我基于该模式创建组件时,Source选项卡中的XHTML被渲染得很好,没有任何名称空间,例如:
<p>a paragraph</p>
<p>
<a href="http://www.sdltridion.com">a link</a>
</p>
我可以保存组件。
但在Firefox(16.0.2,不支持)中,名称空间在“源”选项卡中呈现:
<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验证错误:
命名空间中的元素'Paragraph' 'http://www.yme.com/GeneralContent'中包含无效的子元素'p' 命名空间'http://www.w3.org/1999/XSL/Transform'。可能的清单 期望的元素:命名空间中的任何元素 '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(., ' ', '')) = '' 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(., ' ', '')) = '' 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() ='img'">
<for-each select="@*">
<attribute name="{name()}">
<value-of select="."></value-of>
</attribute>
</for-each>
</when>
<otherwise>
<for-each select="@*">
<choose>
<when test="name() ='border'"></when>
<when test="name() ='cellpadding'"></when>
<when test="name() ='cellspacing'"></when>
<when test="name() ='bgcolor'"></when>
<when test="name() ='bordercolor'"></when>
<when test="name() ='width'"></when>
<when test="name() ='height'"></when>
<when test="name() ='bordercolor'"></when>
<when test="name() ='span'"></when>
<when test="name() ='style'"></when>
<when test="name() ='class'">
<choose>
<when test=". ='MsoNormal'"></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>
答案 0 :(得分:6)
我相信这个问题与这篇文章有关
Tridion 2011 - Filtering XSLT on Formatting Feature window
似乎迁移过程(或者可能是奇怪的GUI行为)正在改变过滤XSLT,并且似乎会影响RTF字段的行为。基本上,在XSLT中使用命名空间和命名空间前缀的方式似乎已经改变。典型的XSLT使用xsl
命名空间前缀,而新的XSLT似乎排除了前缀并使用默认命名空间。
我认为这是一个错误,应该提交给支持,但相关帖子中介绍了解决方法。
答案 1 :(得分:3)
你的样式表有<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">
,<element name="{name()}">
<template match="table|td|tr|th|tbody|p|div|a">
表示它需要输入p
(和table
等)元素并将它们转换为具有相同名称的元素(例如p
)但在XSLT名称空间中。
所以你可能想要的是用前缀(即<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>
也应该这样做。