php - 管理多个 HTML 片段的命名空间

标签 php dom architecture xhtml xml-namespaces

首先请原谅我的英语...:)

我将 XMLNS 用于 HTML 标记,并使用 getElementsByTagNameNSJS 中定位它们并使用 CSS 选择器 xmlns\:tagName 用于 CSS 文档,在服务器端我使用 DOMPHP 对象DOMDocument::getElementsByTagNameNS...

我想知道我做的好不好,或者有没有有效的方法?这种逻辑将来会给我带来麻烦吗?我不知道 ex: DRUPALJOOMLA 是如何管理的?

或者您认为我应该在 PHP 中使用正则表达式和 preg_match_replace 在任何 HTML 属性中添加前缀,并在 JS 文件和 CSS 文件中执行相同的操作?

结构

                        actor
                          |
                          |
                          v
                   +--------------+         +--------------------------------+
                   |  NPresenter  |         |  NNamespace                    |
          +-------+|--------------|+------->|--------------------------------|
          |        |--------------|         |--------------------------------|
          |        | -display();  |         | +full_qualified_js_name();     |
          |        +--------------+         | +full_qualified_less_name();   |
          |                                 | +full_qualified_layout_name(); |
          |                                 +--------------------------------+
          v
 +------------------+                          (assets)
 |  NModel          |                          +------------+
 |------------------|                          | js         |
 |------------------|------------------------->| less       |
 | +file_content(); |                          | layout     |
 +----------------- +                          +------------+

fully_qualified_*_name() 返回目标文件的输出,使用正则表达式和 preg_match_all,我在布局文件中添加 XMLNS,如下所示:

 <?xml version="1.0" encoding="UTF-8"?>
    <html xmlns:aa='zz' xmlns:ee='rr'>
    <head>
       <title></title>
       <script src="/assets/js/appended_js.js"></script>
       <LINK rel="stylesheet" type="text/css" href="/assets/js/appended_css.css"">
    </head>
    <body>
        <aa:span id="span1">
           <aa:p>aaa</aa:p>
        </aa:span>
        <ee:span id="span1">
           <ee:p>aaa</ee:p>
        </ee:span>
    </body>
    </html>

我喜欢下面的 less 文件:

/*less*/
aa\:span{background: #00ff00;}

在 js 文件中,我喜欢下面的内容:

/*js*/
var Namespace = {
    methode1: function() {
       var target = document.getElementsByTagNameNS("aa","zz");

       return target.length;
    }
};

最佳答案

在 Javacript 方面,您可以使用 jQuery Xmlns plugin .它允许您使用命名空间感知的 css 选择器。

var feedTitle = $().xmlns(
  {
    atom : 'http://www.w3.org/2005/Atom'
  },
  function () {
    return this.find("atom|channel > atom|title");
  }
).text();
$('#feedTitle').text(feedTitle);

在 PHP 中,您可以使用 Xpath 查询 DOM。

$dom = new DOMDocument();
$dom->loadXml($file);
$xpath = new DOMXpath($dom);
$xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom');

$feedTitle = $xpath->evaluate('string(//atom:channel/atom:title)', NULL, FALSE));

要在命名空间内创建元素,请使用 DOMDocument::createElementNS()。

三个要点:

  1. 如果您定义自己的 namespace ,结果将不再是 HTML。浏览器将不会识别/呈现这些元素。
  2. 不要将命名空间前缀与实际命名空间混淆。命名空间是 xmlns:* 属性中的字符串。它应该是一个全局唯一的字符串。 (这就是这里经常使用 url 的原因。) namespace 前缀是 namespace 字符串的短别名,但在重新定义之前仅对当前文档的当前分支有效。
  3. 您始终为查询(css 选择器或 xpath)定义自己的前缀到 namespace 映射。这样您的查询就会明确无误。

关于php - 管理多个 HTML 片段的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17245733/

相关文章:

javascript - 下一页 sibling 问题

java - NetBeans 中与 Maven 的跨项目依赖关系

c# - 什么是生活模拟器的好架构

jquery - 大型 MVC Web 应用程序 - 使用 Knockout 和 Razor

php - 跨多个表维护唯一标识

php - 我应该在 while 循环中使用准备好的语句吗?

javascript - 为什么参数读取为true?

PHP DOM : parsing a HTML list into an array?

javascript - jQuery 获取 div 类容器节点中全选输入的子节点

php - jpgraph x 轴刻度