我一直在让我的网页使用无效的XHTML 1.0 Strict,以获取我的网页中自定义实体的好处,以及其他可扩展性功能。
这样做是否有任何问题,或者这是一种非常有效的网页编写方式(除了无法在不了解XHTML mime类型的浏览器中显示)?
我很好奇我是否可以使用XML技术将我自己的网页的bootstrap div包装成有意义的标签,而无需使用javascript来解析自定义标签。
特别是,编写有效的XHTML非常困难,因为很多HTML5标签(如canvas和nav)都没有被定义为有效元素,并且尽管有效的现代Web实践,仍有很多奇怪的方法可以变得无效。这更是一个问题,因为这使得无法使用AngularJS指令创建自定义标记,或使用自定义标记使用javascript进行解析(因为我不知道如何扩展现有的XHTML doctype以使其理解这些标记到是有效的。)
示例:
的index.php :
<?php header('Content-Type: application/xhtml+xml'); ?>
<!-- Not intended to be validated, but exploit XHTML benefits anyway -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml-strict.dtd"
[
<!ENTITY page-title "Daily Bits and Bytes">
]>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>&page-title;</title>
</head>
<body>
</body>
</html>
考虑:
我正在考虑完全删除严格的doctype,而只是使用我自己的doctype并将网页发送为application / xhtml + xml。根据我的理解,XHTML DTD甚至没有被现代浏览器所看到,并且XHTML没有提供HTML默认情况下没有的额外实体/定义,所以它似乎没有为网页添加任何值,而自定义实体则没有。
例如:
<?php header('Content-Type: application/xhtml+xml'); ?>
<!DOCTYPE my-dtd
[
<!ENTITY page-title "Daily Bits and Bytes">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>&page-title;</title>
</head>
<body>
</body>
</html>
示例,为p tag创建自定义颜色属性:
的index.xhtml :
<?xml-stylesheet type="application/xml" href="style.xsl"?>
<!DOCTYPE my-dtd
[
<!ENTITY page-title "Daily Bits and Bytes">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>&page-title;</title>
</head>
<body>
<p color="blue">This paragraph is blue</p>
<p>hello</p>
</body>
</html>
style.xsl :
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="xhtml:p[@color]">
<xsl:element name="xhtml:p">
<xsl:attribute name="style">
color:
<xsl:value-of select="./@color" />
;
</xsl:attribute>
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
自定义域特定元素,例如导航栏,
转动
<navigation-bar>
<link to="someplace">text</link>
</navigation-bar>
到
<nav class="navbar navbar-inverse">
<ul class="nav navbar-nav>
<li><a href="someplace">text</a></li>
</ul>
</nav>
没有javascript(仍然使页面加载速度变慢但是一旦生产结束,你可以通过仅提供转换结果来优化xsl,这比翻译基于jquery / javascript的转换更容易。)
的index.xhtml :
<?xml-stylesheet type="application/xml" href="style.xsl"?>
<!DOCTYPE my-dtd
[
<!ENTITY page-title "Daily Bits and Bytes">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>&page-title;</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
</head>
<body>
<navigation-bar>
<link to="https://stackoverflow.com">StackOverflow</link>
<link to="https://facebook.com">Facebook</link>
<link to="https://twitter.com">Twitter</link>
</navigation-bar>
<p color="blue">I am red</p>
<p>hello</p>
</body>
</html>
style.xsl :
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="xhtml:p[@color]">
<xsl:element name="xhtml:p">
<xsl:attribute name="style">
color:
<xsl:value-of select="./@color" />
;
</xsl:attribute>
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
<xsl:template match="xhtml:navigation-bar">
<xsl:element name="nav">
<xsl:attribute name="class">navbar navbar-inverse</xsl:attribute>
<xsl:element name="ul">
<xsl:attribute name="class">nav navbar-nav</xsl:attribute>
<xsl:for-each select="current()/xhtml:link">
<li>
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="@to" />
</xsl:attribute>
<xsl:value-of select="text()" />
</xsl:element>
</li>
</xsl:for-each>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
不,但是......
我的整个平台使用XHTML5,即HTML5 + XML解析器(application/xhtml+xml
)。 总是是一种有效的方法来严格执行和来实现目标。查看我的个人资料中我的网站的链接。您仍然可以使用XHTML / XML和HTML5。你很幸运我看到了这一点,大多数人都抨击XHTML,因为W3C使用XHTML 2.0的路径很差。您必须使用not-a-doctype-doctype,并且还需要您仍然使用XML声明。
此外,您还没有正确进行内容协商。仅当客户端的用户代理明确声明支持时,您才需要将页面作为application/xhtml+xml
提供。在示例中,IE7的$_SERVER['HTTP_ACCEPT']
标头是*.*
,其总BS是因为IE7不支持squat-diddly。此外,如果客户端的浏览器不支持application/xhtml+xml
,那么您不应该提供XML声明(这也会在旧版本的IE中触发怪癖模式)。
if (isset($_SERVER['HTTP_ACCEPT']) && stristr($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml'))
{
header('Content-Type: application/xhtml+xml; charset=UTF-8');
echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
}
确保浏览器的Web开发工具(通常为网络请求的“Net”)将主页显示为具有application/xhtml+xml
媒体类型/ mime /类型。
答案 1 :(得分:0)
无效的XHTML不是XHTML。这完全是另一回事。它缺乏一个定义,并且它本身并不是一个“东西” - 它只是破碎了。
如果符合模式的格式良好的XML对您来说并不重要,那么您就不需要XHTML。不要假装使用它。只需使用HTML5。