繁体   English   中英

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

[英]How to reorder node elements such that they match an xsd:sequence order?

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

我相信可以使用XSLT来完成此操作,但这听起来像是使用XSLT的解决方案太复杂了,并且使用特殊的java-xlst解析器来执行操作,而不是使用Java本地的东西。

还是我实际上需要编写一个复杂的函数来为我做处理?

如果我正确地理解了您的问题,那么您想要的是一种“神奇的”(如简单的方式)根据外部XSD重新安排节点,而不是使用一些XML API来移动节点的方式。

如果为true,则我不知道有任何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] / preceding-sibling ::: *”,因此您只需将此表达式插入xsl:sort中即可

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

可能需要对名称空间或您可能遇到的其他问题进行一些细化,但是您明白了。

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

import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;

您需要在类路径上放置诸如saxon之类的XML解析器(请参阅http://saxon.sourceforge.net/ )。

您可以“手动”操作XML,读取输入文档的一部分并创建所需的输出文档,或者可以编写xslt样式表并将其用于直接从Java代码转换文档。

试试这里作为起点:

http://oreilly.com/catalog/javaxslt/chapter/ch05.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM