Java 如何重新排列节点元素,使其与xsd:sequence顺序匹配?

Java 如何重新排列节点元素,使其与xsd:sequence顺序匹配?,java,xslt,xsd,jaxb,sequence,Java,Xslt,Xsd,Jaxb,Sequence,是否有任何方法可以对节点对象中的元素进行重新排序,使其与xsd:sequence顺序匹配?我已经阅读了Node.normalize的文档,但它似乎没有执行该功能。还有什么可以做的吗 我相信这可以用XSLT来完成,但使用XSLT和一个特殊的JavaXLST解析器来执行操作,而不是使用java本机的东西,听起来像是一个过于复杂的解决方案 或者我真的需要编写一个复杂的函数来为我进行处理吗?您可以使用以下软件包在Java中直接操作XML: import org.w3c.dom.*; import jav

是否有任何方法可以对节点对象中的元素进行重新排序,使其与xsd:sequence顺序匹配?我已经阅读了Node.normalize的文档,但它似乎没有执行该功能。还有什么可以做的吗

我相信这可以用XSLT来完成,但使用XSLT和一个特殊的JavaXLST解析器来执行操作,而不是使用java本机的东西,听起来像是一个过于复杂的解决方案


或者我真的需要编写一个复杂的函数来为我进行处理吗?

您可以使用以下软件包在Java中直接操作XML:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
您需要在类路径上放置一个XML解析器,如saxon-see

您可以“手动”操作XML,读取输入文档的一些内容并创建所需的输出文档,也可以编写xslt样式表并使用它直接从Java代码转换文档

请尝试从这里开始:


您可以使用以下软件包在Java中直接操作XML:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
您需要在类路径上放置一个XML解析器,如saxon-see

您可以“手动”操作XML,读取输入文档的一些内容并创建所需的输出文档,也可以编写xslt样式表并使用它直接从Java代码转换文档

请尝试从这里开始:


如果我没有看错您的问题,那么您想要的是一种神奇的方式,即根据外部XSD重新排列节点的简单方式,而不是使用一些XML API移动节点的方式

如果是真的,那么我不知道有哪种API提供了实现这一目标的通用方法。考虑到XSD能够描述的内容模型的复杂性,它也不是一个微不足道的编程

在非常简单的情况下,这几乎是不可能解决的。想想这个非常简单的例子:想象一个由两个选项组成的内容模型,i序列a-b-c,ii序列b-c-a。根据您的需求,XML内容的顺序是c-b-a,您希望接收无效的XML,并使其有效。在本例中,哪种方法正确

当然,我不是说这是你的情况。我只是想指出,据我所知,为什么没有人提出解决这一问题的办法


如果序列下的内容模型非常琐碎,因此不管XML的到达顺序如何,都可以以一种明确的方式解决它,或者如果XML内容始终以一种已知但错误的方式出现,那么您必须使用首选的XML操作方法对其进行编码——但我建议,不要试图让它通用化,它只是一个兔子洞

如果我没有看错您的问题,那么您想要的是一种神奇的方式,即根据外部XSD重新安排节点,而不是使用一些XML API移动节点

如果是真的,那么我不知道有哪种API提供了实现这一目标的通用方法。考虑到XSD能够描述的内容模型的复杂性,它也不是一个微不足道的编程

在非常简单的情况下,这几乎是不可能解决的。想想这个非常简单的例子:想象一个由两个选项组成的内容模型,i序列a-b-c,ii序列b-c-a。根据您的需求,XML内容的顺序是c-b-a,您希望接收无效的XML,并使其有效。在本例中,哪种方法正确

当然,我不是说这是你的情况。我只是想指出,据我所知,为什么没有人提出解决这一问题的办法


如果序列下的内容模型非常琐碎,因此不管XML的到达顺序如何,都可以以一种明确的方式解决它,或者如果XML内容始终以一种已知但错误的方式出现,那么您必须使用首选的XML操作方法对其进行编码——但我建议,不要试图让它通用化,它只是一个兔子洞

如果您只需要担心xs:sequence,而不需要选择/重复,并且只要模式没有编写为使用许多复杂的功能,如命名模型组、替换组和通配符,那么它应该不会太难,至少如果您使用XSLT 2.0或XQuery,而忘记了尝试用Java编写代码。如果变量$seq是xs:sequence元素,那么名为$E的元素的排序键是count$x/xs:element[@name |@ref=$E]/前面的同级::*,因此您可以将此表达式插入xsl:sort as

<xsl:for-each select="*">
  <xsl:sort select="count($seq/xs:element[(@name|@ref)=local-name(current())]/preceding-sibling::*"/>
  ...
</xsl:for-each>

可能需要对名称空间或其他可能遇到的问题进行一些精细处理,但您知道了。

如果您只需要担心xs:sequence,而不需要选择/重复,并且只要 e schema的编写并不是为了使用许多复杂的特性,如命名模型组、替换组和通配符,那么它应该不会太难,至少如果您使用XSLT 2.0或XQuery,而忘记了尝试用Java编写代码。如果变量$seq是xs:sequence元素,那么名为$E的元素的排序键是count$x/xs:element[@name |@ref=$E]/前面的同级::*,因此您可以将此表达式插入xsl:sort as

<xsl:for-each select="*">
  <xsl:sort select="count($seq/xs:element[(@name|@ref)=local-name(current())]/preceding-sibling::*"/>
  ...
</xsl:for-each>

可能需要对名称空间或您可能遇到的其他事情进行一些精细处理,但是您知道了。

Saxon不是XML解析器;在任何情况下,这就像告诉想知道如何制作煎蛋饼的人他需要一个煎锅;在任何情况下,这就像告诉想知道如何做煎蛋的人他需要一个煎锅