我有一个项目,我们正在处理的主要文件是创建者提出了一个非常非结构化DTD(所有的元素都是可选的,并且会出现,这读取文件实际上预计许多0次或更多次。更妙的是应用程序中的旧XML文件根据需要)的值的。 我已创建基于已知的应用需求的XSD,并移动无序元素列表到在XSD序列。
是否有一个简单的转换过程(如XSLT)可以采取旧的XML文件,并在指定的方式排序的元素,使我们可以使用新的XSD来验证呢?
例:
<Top>
<A/>
<D/>
<B/>
<C/>
<A/>
</TOP>
INTO
<Top>
<A/>
<A/>
<B/>
<C/>
<D/>
</TOP>
另外孩子还可能有哪些还需要进行排序到新的序列预期排序元素。 谢谢!
除了指定模板中的所有订购的元素,你可以在一个更声明的方式是“查找列表”嵌入样式表使用方法:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my-namespace"
exclude-result-prefixes="my">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<my:Top>
<my:A>
<my:AA/>
<my:AB/>
<my:AC/>
</my:A>
<my:B/>
<my:C/>
<my:D/>
</my:Top>
<xsl:template match="my:*">
<xsl:param name="source"/>
<xsl:variable name="current-lookup-elem" select="current()"/>
<xsl:for-each select="$source/*[name()=local-name($current-lookup-elem)]">
<xsl:copy>
<xsl:apply-templates select="$current-lookup-elem/*">
<xsl:with-param name="source" select="current()"/>
</xsl:apply-templates>
<xsl:copy-of select="text()"/>
</xsl:copy>
</xsl:for-each>
</xsl:template>
<xsl:template match="/Top">
<xsl:apply-templates select="document('')/*/my:*">
<xsl:with-param name="source" select="/"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
此示例:
<Top>
<A>
<AC/>
<AA/>
</A>
<D/>
<B/>
<C>yyy</C>
<A>
<AB/>
<AC/>
<AA>xxx</AA>
</A>
</Top>
将返回:
<Top>
<A>
<AA>xxx</AA>
<AC/>
</A>
<A>
<AA/>
<AB/>
<AC/>
</A>
<B/>
<C>yyy</C>
<D/>
</Top>
我假设你不希望你的按字母顺序排列的元素,而是把它们放在你指定的顺序。 试试这个- you'll需要XSLT处理器(如撒克逊 ),并将该文件保存为*的.xsl。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" version="1.0" />
<xsl:template match="Top">
<xsl:copy>
<xsl:for-each select="A">
<xsl:copy-of select="." />
</xsl:for-each>
<xsl:for-each select="B">
<xsl:copy-of select="." />
</xsl:for-each>
<xsl:for-each select="C">
<xsl:copy-of select="." />
</xsl:for-each>
<xsl:for-each select="D">
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
BIG警告,虽然:XML是大小写敏感的,所以你的<Top>
和</TOP>
标签不匹配,所以你没有良好的XML,所以XSLT处理器将抛出一个错误,然后退出。
<xsl:copy-of>
拷贝的匹配元素及其所有子(含属性)。 要重新排列更深的层次,可以更换xsl:copy-of
与xsl:copy
,然后从那里调用类似的模板来输出以一个新的水平。