使用无效的XHTML 1.0 Strict是否有好处?

3

为了在我的网页中使用自定义实体以及其他可扩展功能,我一直在使用无效的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>

考虑因素:
我正在考虑完全放弃使用严格的文档类型声明,而是使用自己的文档类型声明,并将网页作为应用程序/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 标签创建自定义颜色属性:

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>

你为什么不能在服务器端处理页面并在渲染期间将变量推入其中,以避免自定义实体?或者,如果你选择了Angular,则可以在页面加载时填充这些变量。 - aardrian
@aardrian 我可以这样做,但我对这种特定的做法很好奇,因为它很有趣。因为我可以将页面作为 .xhtml 发送,并且它将在不允许 JavaScript 的浏览器上工作(适用于没有 JavaScript 也能正常显示的页面)。 - Dmytro
1
它真的能在所有浏览器上运行(不考虑 JS)吗?尽管如此,我还是不会这样做。一个良好结构的 HTML 5 页面带来了许多免费的可访问性、SEO、可用性等方面的益处,我甚至没有考虑回到已废弃的规范。 - aardrian
@aardrian,这肯定不会在所有浏览器上都起作用,我知道IE6会尝试下载application/xhtml+xml,就像它是任何其他二进制文件一样,但到目前为止,我见过的任何现代浏览器似乎都表现得可预测。通过放弃已弃用的规范,而采用我自己的文档类型,我也解决了这个问题。我的问题是,我是否忽略了一些基本问题,或者这确实没问题,在这种情况下,对于现代网页来说,不使用它似乎很愚蠢。 - Dmytro
我指的是我的第二个句子的第一部分。仅考虑可访问性,我会建议使用HTML5而不是它。SEO也是一个因素。 - aardrian
如果您已经使用自定义DTD的话,我可以向您推荐我的这个回答,其中解决了向XHTML 1中添加自定义元素(例如canvas)并通过W3C验证器的方法。链接在此:http://stackoverflow.com/questions/37675308/canvas-validation-xhtml/37711314#37711314 - Mr Lister
2个回答

1

不,然而...

我的整个平台使用的是XHTML5,即HTML5 + XML解析器 (application/xhtml+xml)。有一种有效的方法可以严格编写代码并实现您的目标。请查看我个人资料中的链接以访问我的网站。您仍然可以使用所有XHTML / XML与HTML5。你很幸运我看到了这个问题,因为大多数人都因W3C在XHTML 2.0上走的错误路线而抨击XHTML。您将需要使用非文档类型文档,并且仍需要使用XML声明。

此外,您没有正确执行内容协商。您需要仅在客户端用户代理明确声明支持时才将页面作为application/xhtml+xml提供。例如,IE7的$_SERVER['HTTP_ACCEPT']头是*.*,这完全是胡说八道,因为IE7什么都不支持。另外,如果客户端浏览器不支持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";
   }

请确保浏览器的网页开发工具(通常是 "Net" 用于网络请求)将主页面显示为具有 application/xhtml+xml 媒体类型/ MIME/类型。

0

不.

无效的XHTML并非XHTML。它完全是另一回事。它缺乏定义,实际上并不是一个独立的“东西”——它只是破碎了。

如果符合模式的格式良好的XML对您并不重要,那么您就不需要XHTML。不要假装在使用它。直接使用HTML5。


如果我删除xhtml xmlns(或将其更改为另一个uuid /地址),我的浏览器将停止呈现页面作为html。我并不确定它不是xhtml,它不是有效的现有xhtml模式(strict / transitional / frameset等),但它仍然似乎是xhtml。当然,它缺乏定义,但定义是通过成为html而暗示的,浏览器对定义毫不在意,验证器会关心(尤其是在带有脚本的页面上)。 - Dmytro
当你说“它仍然似乎是xhtml”时,你没有理解这个答案的重点。这里不存在“似乎”的可能性,因为除了有效的XHTML外,没有其他的XHTML。 - kjhughes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接