【问题标题】:why would an inline XMLNS change the entire tag structure? JSF为什么内联 XMLNS 会改变整个标签结构? JSF
【发布时间】:2019-07-29 19:49:31
【问题描述】:

我提前道歉,我没有做很多前端开发。但简而言之,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 的示例,并与 html 的 xmlns 一起呈现 xhtml

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>

详情:

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

应用服务器 + IDE:Glassfish 5.0 - Java EE 8 - JSF 2.3.2 - SCSS css pre-proccessor only processing .scss files - intellij IDEA Ultimate (Latest)

所有文件都是 .xhtml,目前没有托管 bean、代码或 javascript 以任何方式影响这一点。

当 html 在没有 JSF 的情况下放入 tomcat 时,不会发生这种情况。这就是我指向 JSF 的原因,但我可能不正确。

【问题讨论】:

  • Thomas 如果您认为您的最后一条评论不再有效并且被合理地删除,您应该删除您的反对票。但是请注意,我非常乐意以任何实际上更容易理解/回答的方式更改我的问题。然而,那些只是将迷你模组作为一种强力游戏的人对社区的伤害远远超过了他们对社区的帮助。我的问题结构良好,以前没有问过,有代码示例,标题中的问题,这怎么值得反对?
  • 我很想帮忙,但是那种抱怨和我看不到其他 cmets 和问题不是 minimal reproducible example,你指着 JSF 而同时说你对前端开发知之甚少,这让我有点不情愿。由于 JSF 在 xml 上工作(并对其进行验证),我怀疑 JSF 是否这样做,因为它会导致 xml dom 错误。首先确保您的 jsf 命名空间都来自同一个版本。然后把它变成一个真正的minimal reproducible example,提供版本信息(JSF 和'jsp' 是史前的,但你确实有部分非常现代的 jsf 命名空间)
  • 所以实际上你的问题中缺少很多东西,如果对于各种不好(通常是坏)的问题,我得到 10 欧元,-,我可以在热带岛屿上度过一个美好的假期.是的,然后通常会通过投票进行简单的修改。请记住,我们都是在空闲、免费、无偿的时间里做这件事的!!!
  • 您好,感谢您的评论。我并不是说我前端知识少,我为许多主要网站开发过前端,这不是我的重点。 JSF 绝不是史前的,所以我当然有现代的命名空间,我有理由使用 JSF 我不会进入。它不会导致 dom 错误,因为它正在移动允许它验证的 xml 标签,我的帖子中丢失的锚点被移动了很远。我无法将源代码发布到我的网站,所以这是我能够发布的内容。
  • 如果它没有透露我的所有来源,我很乐意添加更多信息,但根据我的经验,我添加的信息应该足以让一些人对从哪里开始寻找的意见。正如你所说,我将开始浏览版本。我同意你的观点,这可能不是 JSF,但是当在没有 EE 的 tomcat 中运行时,它不会这样做。感谢您的帮助,我将相应地编辑我的帖子。它也可能是玻璃鱼,或 CDI,也可能是研究不佳。

标签: jsf svg xml-namespaces


【解决方案1】:

我调试了一下,发现这一定是在 JSF SAXCompiler 例程中发生的。 虽然 com.sun.faces.facelets.compiler.SAXCompiler.CompilationHandler 会根据 XHTML 源代码以正确的顺序调用其 startElementendElement 方法,但结果是

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

com.sun.faces.facelets.impl.DefaultFaceletFactoryMojarra 2.3.8 的第 475 行,是一个 FaceletHandler,表示观察到的错误元素树结构。

这已被报告为错误#4555

还有a very similar question before,当时是reported as a bug to Mojarra。随着该错误得到解决,我认为这是一个新错误。因此,我建议您使用缩小的可重现示例报告该错误。对于您的应用程序,您应该考虑使用 &lt;ui:include src="/resources/svg/one.svg" /&gt; 嵌入 SVG,正如 BalusC 对 the other question 的建议。

【讨论】:

  • 非常感谢!你是最棒的。我将查看该课程以了解该问题,然后我将在今天晚些时候将其报告为错误。在最新的 2_3 中,此方法调用在 457 上,475 是错字还是我在错误的分支上?我将不得不挖掘以查看传递给该 init() 的编译器,因为乍一看我仍然看不到相关性。我会用 svgs 做到这一点。我什至从未想过为此添加一个 ui。再次感谢!
  • @NathanH 欢迎您 - DefaultFaceletFactory 中有两条这样的行。只需在com.sun.faces.facelets.compiler.SAXCompiler.CompilationHandler 上设置一些断点,您就会从它的调用位置看到它,并且您已经非常接近我猜想的问题 - 并没有深入研究它。如果您报告或发现已报告的问题,请告诉我们问题 ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 2016-10-16
  • 1970-01-01
  • 2015-07-28
  • 2019-12-23
相关资源
最近更新 更多