内联XMLNS为什么会更改整个标签结构? JSF

时间:2019-03-07 20:08:53

标签: jsf svg xml-namespaces

提前致歉,我没有做很多前端开发。但是简而言之,xmlns属性是删除标记并将其在呈现的文档中移动。这可能是一个JSF问题,因为它甚至发生在视图源中。此svg标记有效且不会更改结构:

<svg id="Layer_1"  x="0px" y="0px" width="150px" height="150px" viewBox="0 0 150 150" enable-background="new 0 0 150 150">

但是,一旦声明了xml名称空间,页面上的所有代码都会被更改。它移动我的span标签,一个标签,header标签,删除关闭的div标签,并以破坏所有内容的方式对其进行排序。这是原始xhtml的示例,并呈现了xhtml和html的xmlns

jsf之前的xhtml:

 <a href="?service=all" class="#{servicesAllClass}">
                      <span>
                          <svg **xmlns="http://www.w3.org/2000/svg"**  id="Layer_1"  x="0px" y="0px"
                               width="150px" height="150px" viewBox="0 0 150 150" enable-background="new 0 0 150 150">
                            <path fill="#3A3838" d="M126.83,8.875H22.169c-7.116,0-12.884,5.768-12.884,12.884v102.482c0,7.115,5.768,12.884,16.884,12.884
                                H130.83c3.116,0,8.884-5.769,8.884-12.884V21.759C139.714,14.643,133.946,8.875,126.83,8.875z M38.643,118.505
                                c-5.93,0-10.737-4.807-10.737-10.737c0-5.93,4.807-10.736,10.737-10.736s10.736,4.807,10.736,10.736
                                C49.379,113.698,44.573,118.505,38.643,118.505z M38.643,83.736c-5.93,0-10.737-4.806-10.737-10.736
                                c0-5.93,4.807-10.737,10.737-10.737S49.379,67.07,49.379,73C49.379,78.931,44.573,83.736,38.643,83.736z M38.643,48.969
                                c-5.93,0-10.737-4.807-10.737-10.737s4.807-10.736,10.737-10.736s10.736,4.806,10.736,10.736S44.573,48.969,38.643,48.969z
                                 M112.834,45.167H68.166c-4.418,0-8-3.582-8-8s3.582-8,8-8h44.668c4.418,0,8,3.582,8,8S117.252,45.167,112.834,45.167z
                                 M112.834,80.167H68.166c-4.418,0-8-3.581-8-8c0-4.418,3.582-8,8-8h44.668c4.418,0,8,3.582,8,8
                                C120.834,76.586,117.252,80.167,112.834,80.167z M112.834,115.167H68.166c-4.418,0-8-3.581-8-8s3.582-8,8-8h44.668
                                c4.418,0,8,3.581,8,8S117.252,115.167,112.834,115.167z"></path>
                            </svg>
                         </span>
                      <h5>All</h5>
                  </a>

这是JSF之后的代码,当xmlns位于标记中时,请注意缺少闭合锚标记,该标记没有被遗漏,只是不存在。但是,当删除xmlns时,它的显示与原始(上面)脚本完全相同,因此我选择不包括它。

在任何浏览器中提取时的DOM(请注意缺少的锚标记,它像30行一样向下移动了

<a href="?service=all-services" class="disabled">
                      <span><svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" x="0px" y="0px" width="150px" height="150px" viewBox="0 0 150 150" enable-background="new 0 0 150 150">
                            <path fill="#3A3838" d="M126.83,8.875H22.169c-7.116,0-12.884,5.768-12.884,12.884v102.482c0,7.115,5.768,12.884,16.884,12.884                                     H130.83c3.116,0,8.884-5.769,8.884-12.884V21.759C139.714,14.643,133.946,8.875,126.83,8.875z M38.643,118.505                                     c-5.93,0-10.737-4.807-10.737-10.737c0-5.93,4.807-10.736,10.737-10.736s10.736,4.807,10.736,10.736                                     C49.379,113.698,44.573,118.505,38.643,118.505z M38.643,83.736c-5.93,0-10.737-4.806-10.737-10.736                                     c0-5.93,4.807-10.737,10.737-10.737S49.379,67.07,49.379,73C49.379,78.931,44.573,83.736,38.643,83.736z M38.643,48.969                                     c-5.93,0-10.737-4.807-10.737-10.737s4.807-10.736,10.737-10.736s10.736,4.806,10.736,10.736S44.573,48.969,38.643,48.969z                                      M112.834,45.167H68.166c-4.418,0-8-3.582-8-8s3.582-8,8-8h44.668c4.418,0,8,3.582,8,8S117.252,45.167,112.834,45.167z                                      M112.834,80.167H68.166c-4.418,0-8-3.581-8-8c0-4.418,3.582-8,8-8h44.668c4.418,0,8,3.582,8,8                                     C120.834,76.586,117.252,80.167,112.834,80.167z M112.834,115.167H68.166c-4.418,0-8-3.581-8-8s3.582-8,8-8h44.668                                     c4.418,0,8,3.581,8,8S117.252,115.167,112.834,115.167z"></path>
                            </svg>

                      <h5>All</h5>
                  </span>

所需的完整文件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns:jsp="http://java.sun.com/JSP/Page"   xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets">
<head></head>
<body>
<ui:composition>
<div style="display:grid;">
 <a href="?service=all" class=".test">
                      <span>
                          <svg xmlns="http://www.w3.org/2000/svg"  id="Layer_1"  x="0px" y="0px"
                               width="150px" height="150px" viewBox="0 0 150 150" enable-background="new 0 0 150 150">
                            <path fill="#3A3838" d="M126.83,8.875H22.169c-7.116,0-12.884,5.768-12.884,12.884v102.482c0,7.115,5.768,12.884,16.884,12.884
                                H130.83c3.116,0,8.884-5.769,8.884-12.884V21.759C139.714,14.643,133.946,8.875,126.83,8.875z M38.643,118.505
                                c-5.93,0-10.737-4.807-10.737-10.737c0-5.93,4.807-10.736,10.737-10.736s10.736,4.807,10.736,10.736
                                C49.379,113.698,44.573,118.505,38.643,118.505z M38.643,83.736c-5.93,0-10.737-4.806-10.737-10.736
                                c0-5.93,4.807-10.737,10.737-10.737S49.379,67.07,49.379,73C49.379,78.931,44.573,83.736,38.643,83.736z M38.643,48.969
                                c-5.93,0-10.737-4.807-10.737-10.737s4.807-10.736,10.737-10.736s10.736,4.806,10.736,10.736S44.573,48.969,38.643,48.969z
                                 M112.834,45.167H68.166c-4.418,0-8-3.582-8-8s3.582-8,8-8h44.668c4.418,0,8,3.582,8,8S117.252,45.167,112.834,45.167z
                                 M112.834,80.167H68.166c-4.418,0-8-3.581-8-8c0-4.418,3.582-8,8-8h44.668c4.418,0,8,3.582,8,8
                                C120.834,76.586,117.252,80.167,112.834,80.167z M112.834,115.167H68.166c-4.418,0-8-3.581-8-8s3.582-8,8-8h44.668
                                c4.418,0,8,3.581,8,8S117.252,115.167,112.834,115.167z"></path>
                            </svg>
                         </span>
                      <h5>All</h5>
                  </a>
</div>
</ui:composition>
</body>
</html>

详细信息:

我明确的问题:“将XML名称空间属性添加到元素时,可能导致dom更改的原因是什么?”

应用程序服务器+ IDE:Glassfish 5.0-Java EE 8-JSF 2.3.2-SCSS css预处理程序仅处理.scss文件-intellij IDEA Ultimate(最新)

所有文件均为.xhtml,目前还没有托管Bean,代码或javascript以任何方式影响此效果。

如果将HTML放入没有JSF的tomcat中,则不会发生这种情况。这就是为什么我指的是JSF,但我可能不正确。

1 个答案:

答案 0 :(得分:1)

我调试了一下,发现这一定是在JSF SAXCompiler例程中发生的。 尽管com.sun.faces.facelets.compiler.SAXCompiler.CompilationHandler按照XHTML源代码以正确的顺序调用了自己的startElementendElement方法,但是

的结果
FaceletHandler h = this.compiler.compile(url, alias);

com.sun.faces.facelets.impl.DefaultFaceletFactory Mojarra 2.3.8的第475行是表示观察到的错误元素树结构的FaceletHandler

也有a very similar question,当时为reported as a bug to Mojarra。解决该错误后,我认为这是一个新错误。因此,我建议您使用缩小的可复制示例报告该错误。对于您的应用程序,您应该考虑使用BalusC建议的<ui:include src="/resources/svg/one.svg" />来响应the other question来使用SVG。