3

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

我使用XMLNS标签HTML并将它们定位在JSgetElementsByTagNameNS使用文档CSS选择器xmlns\:tagNameCSS在服务器端我DOMPHP对象一起使用DOMDocument::getElementsByTagNameNS一起使用......

我想知道我做得好还是有有效的方法?这种逻辑可能会在将来给我带来问题吗?我不知道怎么做前: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() 使用 regexp 和 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*/
aa\:span{background: #00ff00;}

在 js 文件中,我如下所示:

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

       return target.length;
    }
};
4

1 回答 1

1

在 Javacript 方面,您可以使用jQuery Xmlns 插件。它允许您使用命名空间感知 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. 如果您定义自己的名称空间,则结果不再是 HTML。浏览器将无法识别/渲染元素。
  2. 不要将命名空间前缀与实际命名空间混淆。命名空间是 xmlns:* 属性中的字符串。它应该是一个全局唯一的字符串。(这就是这里经常使用 url 的原因。)命名空间前缀是命名空间字符串的短别名,但在重新定义之前仅对当前文档的当前分支有效。
  3. 您始终为查询(css 选择器或 xpath)定义自己的名称空间映射前缀。这样您的查询就很明确了。
于 2013-11-07T10:10:19.870 回答