XSLT副本 - 在Opera中不起作用,打破标签

时间:2012-10-26 06:41:54

标签: html xslt tags opera

我遇到的问题是Opera将我的p标签拆分为不应该的地方。

以下是XML示例:

<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="temp.xsl"?>
<data>
    <item name="car">
        <summary>It goes by land.</summary>
    </item>
    <item name="plane">
        <summary>It simply flies.</summary>
    </item>
</data>

这是XSL:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/data">
        <html>
            <link rel="stylesheet" type="text/css" href="temp.css"/>
            <body>
                <xsl:for-each select="item">
                    <h1><xsl:value-of select="@name"/></h1>
                    <xsl:if test="count(summary)&gt;0">
                        <p class="summary"><xsl:copy-of select="summary" /></p>
                    </xsl:if>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

和CSS:

body { 
    font-size:14px;  text-align:center;  width:400px;  margin:0 auto; font-family:Verdana; 
}

h1 { 
    color: #231F20;  font-size: 1.2em; 
} 

.summary { 
    text-align: justify; padding: 1em; background-color: #F0F4F8;
    border-left: 1px solid #BBB; border-right: 1px solid #BBB; 
}

当我在IE9中运行它时,它看起来像这样: IE9

IE9不尊重正文的宽度,但这并不重要,XSLT正确地转换了数据。 summary xml标记位于p标记与class="summary"之间。

但是当我在Opera 12中运行它时,我得到了这个:Opera12

如您所见,宽度得到了尊重,但p标记分为两部分,其间插入了summary标记。这可以在Opera的检查员看到:

Inspector

我需要使用copy-of而不是value-of,因为我希望&lt;summary&gt;标记包含html标记,例如b,{{1 },或i

为什么Opera将span标记分成两个空标记并在它们之间插入p?如何避免这种情况,使我能够将summary标记的内容放在summary标记内?

2 个答案:

答案 0 :(得分:1)

HTML5有一个summary元素:http://www.w3.org/TR/html5/single-page.html#the-summary-element。目前尚不清楚您是否认为输入中的summary元素是要复制到转换结果文档的HTML5 summary元素,或者它是否只是您选择的任意XML元素XML输入格式。至于IE和Opera中解析的差异,可能是由于summary元素本身或不同的HTML5解析实现的不同HTML5支持引起的,其中Opera似乎将摘要结果元素视为HTML5元素,似乎试图将它移动到它所属的地方。正如您在链接的HTML5规范中所看到的,它描述了HTML5 summary元素:“可以使用此元素的上下文:作为详细信息元素的第一个子元素。”这意味着它在p元素中没有位置,因此可能会移动到您的XSLT尝试将其置于p之外。

所以你有两个选择,要么只复制summary元素的子节点,as you have already done,要么更改你的XSLT以在正确的上下文中创建一个带有summary的干净HTML5 HTML5为该元素指定。

答案 1 :(得分:0)

我发现改变了

<p class="summary"><xsl:copy-of select="summary" /></p>

<p class="summary"><xsl:copy-of select="summary/node()" /></p>

解决了这个问题。

但我不确定为什么浏览器之间存在差异。