我遇到的问题是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)>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不尊重正文的宽度,但这并不重要,XSLT正确地转换了数据。 summary
xml标记位于p
标记与class="summary"
之间。
但是当我在Opera 12中运行它时,我得到了这个:
如您所见,宽度得到了尊重,但p
标记分为两部分,其间插入了summary
标记。这可以在Opera的检查员看到:
我需要使用copy-of
而不是value-of
,因为我希望<summary>
标记包含html
标记,例如b
,{{1 },或i
。
为什么Opera将span
标记分成两个空标记并在它们之间插入p
?如何避免这种情况,使我能够将summary
标记的内容放在summary
标记内?
答案 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>
解决了这个问题。
但我不确定为什么浏览器之间存在差异。