是否可以使用无效的XHTML 1.0 Strict来获益?

时间:2016-06-12 18:08:22

标签: xml html5 xhtml

我一直在让我的网页使用无效的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>

2 个答案:

答案 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。