我有一个项目,我们正在处理的主文件是一个旧的XML文件,其中创建者创建了一个非结构化的DTD(所有元素都是可选的,可以发生0次或更多次.更好的是,读取文件的应用程序实际上需要很多根据需要的值).我根据已知的应用程序要求创建了一个XSD,并将无序元素列表移动到XSD中的序列中.
是否有一个简单的转换过程(例如XSLT)可以获取旧的XML文件,并以指定的方式对其元素进行排序,以便我们可以使用新的XSD来验证它?
例:
<Top>
<A/>
<D/>
<B/>
<C/>
<A/>
</TOP>
Run Code Online (Sandbox Code Playgroud)
INTO
<Top>
<A/>
<A/>
<B/>
<C/>
<D/>
</TOP>
Run Code Online (Sandbox Code Playgroud)
孩子们也可能有元素需要也被分类到新的序列预期排序.谢谢!
您可以以更具说明性的方式使用样式表中嵌入的"查找列表",而不是在模板中指定要排序的所有元素:
<?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>
Run Code Online (Sandbox Code Playgroud)
这个样本:
<Top>
<A>
<AC/>
<AA/>
</A>
<D/>
<B/>
<C>yyy</C>
<A>
<AB/>
<AC/>
<AA>xxx</AA>
</A>
</Top>
Run Code Online (Sandbox Code Playgroud)
将返回:
<Top>
<A>
<AA>xxx</AA>
<AC/>
</A>
<A>
<AA/>
<AB/>
<AC/>
</A>
<B/>
<C>yyy</C>
<D/>
</Top>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1592 次 |
| 最近记录: |