[英]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代码转换文档。
试试这里作为起点:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.