为什么内联 XMLNS 会改变整个标签结构? JSF
why would an inline XMLNS change the entire tag structure? JSF
提前致歉,我没有做很多前端开发。但简而言之,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 标签、a 标签、标题标签,删除结束 div 标签,并以一种破坏一切的方式对它们进行排序。这是原始 xhtml 和渲染 xhtml 以及 html 的 xmlns
的示例
pre-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>
详情:
我的明确问题:"What could possibly cause the dom to be changed when an XML namespace attribute is added to an element?"
应用程序服务器 + IDE:Glassfish 5.0 - Java EE 8 - JSF 2.3.2 - SCSS css pre-proccessor 仅处理 .scss文件-intellij IDEA Ultimate(最新)
所有文件都是 .xhtml,目前没有托管 bean、代码或 javascript 以任何方式影响它。
当 html 被放入 tomcat 而没有 JSF 时,这不会发生。这就是我指向 JSF 的原因,但我可能不正确。
我调试了一下,发现这一定发生在 JSF SAXCompiler 例程中。
虽然 com.sun.faces.facelets.compiler.SAXCompiler.CompilationHandler
的 startElement
和 endElement
方法按照 XHTML 源代码以正确的顺序调用,但
的结果
FaceletHandler h = this.compiler.compile(url, alias);
在 com.sun.faces.facelets.impl.DefaultFaceletFactory
Mojarra 2.3.8 的第 475 行,是一个 FaceletHandler
表示观察到的错误元素树结构。
这已被报告为错误 #4555。
还有 a very similar question before which was then reported as a bug to Mojarra. As that bug is resolved, I'd consider this to be a new one. So I'd suggest you to report that bug using a minified reproducable example. For your application you should consider to emebed SVGs using <ui:include src="/resources/svg/one.svg" />
as BalusC suggest in response to the other question.
提前致歉,我没有做很多前端开发。但简而言之,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 标签、a 标签、标题标签,删除结束 div 标签,并以一种破坏一切的方式对它们进行排序。这是原始 xhtml 和渲染 xhtml 以及 html 的 xmlns
的示例pre-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>
详情:
我的明确问题:"What could possibly cause the dom to be changed when an XML namespace attribute is added to an element?"
应用程序服务器 + IDE:Glassfish 5.0 - Java EE 8 - JSF 2.3.2 - SCSS css pre-proccessor 仅处理 .scss文件-intellij IDEA Ultimate(最新)
所有文件都是 .xhtml,目前没有托管 bean、代码或 javascript 以任何方式影响它。
当 html 被放入 tomcat 而没有 JSF 时,这不会发生。这就是我指向 JSF 的原因,但我可能不正确。
我调试了一下,发现这一定发生在 JSF SAXCompiler 例程中。
虽然 com.sun.faces.facelets.compiler.SAXCompiler.CompilationHandler
的 startElement
和 endElement
方法按照 XHTML 源代码以正确的顺序调用,但
FaceletHandler h = this.compiler.compile(url, alias);
在 com.sun.faces.facelets.impl.DefaultFaceletFactory
Mojarra 2.3.8 的第 475 行,是一个 FaceletHandler
表示观察到的错误元素树结构。
这已被报告为错误 #4555。
还有 a very similar question before which was then reported as a bug to Mojarra. As that bug is resolved, I'd consider this to be a new one. So I'd suggest you to report that bug using a minified reproducable example. For your application you should consider to emebed SVGs using <ui:include src="/resources/svg/one.svg" />
as BalusC suggest in response to the other question.