从平面xml创建嵌套xml
好吧,我真的被卡住了 我试图从平面xml文件中重新创建层次结构,但我不知道如何继续。我使用的xml文件看起来有点像这样:从平面xml创建嵌套xml,xml,xslt,Xml,Xslt,好吧,我真的被卡住了 我试图从平面xml文件中重新创建层次结构,但我不知道如何继续。我使用的xml文件看起来有点像这样: <table name="ecatalogue"> <tuple> <atom name="irn">2470</atom> <atom name="EADUnitID"></atom> <atom name="EADUnitTitle"></atom>
<table name="ecatalogue">
<tuple>
<atom name="irn">2470</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<atom name="EADLevelAttribute"></atom>
<tuple name="AssParentObjectRef">
</tuple>
</tuple>
<tuple>
<atom name="irn">5416</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<tuple name="AssParentObjectRef">
<atom name="irn">2470</atom>
<atom name="EADUnitTitle"></atom>
</tuple>
</tuple>
<tuple>
<atom name="irn">7</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<tuple name="AssParentObjectRef">
<atom name="irn">2470</atom>
<atom name="EADUnitTitle"></atom>
</tuple>
</tuple>
<tuple>
<atom name="irn">8</atom>
<atom name="ObjectType"></atom>
<atom name="EADLevelAttribute"></atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<tuple name="AssParentObjectRef">
<atom name="EADUnitTitle"></atom>
<atom name="irn">7</atom>
</tuple>
</tuple>
</table>
<table name="ecatalogue">
<collection>
<tuple>
<atom name="irn">2470</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<atom name="EADLevelAttribute"></atom>
<tuple name="children">
<tuple>
<atom name="irn">5416</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<atom name="EADLevelAttribute"></atom>
<tuple name="children"></tuple>
</tuple>
<tuple>
<atom name="irn">7</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<atom name="EADLevelAttribute"></atom>
<tuple name="children">
<tuple>
<atom name="irn">8</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<atom name="EADLevelAttribute"></atom>
<tuple name="children"></tuple>
</tuple>
</tuple>
</tuple>
</tuple>
</tuple>
</collection>
2470
5416
2470
7.
2470
8.
7.
我想要实现的是一个类似以下内容的文件:
<table name="ecatalogue">
<tuple>
<atom name="irn">2470</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<atom name="EADLevelAttribute"></atom>
<tuple name="AssParentObjectRef">
</tuple>
</tuple>
<tuple>
<atom name="irn">5416</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<tuple name="AssParentObjectRef">
<atom name="irn">2470</atom>
<atom name="EADUnitTitle"></atom>
</tuple>
</tuple>
<tuple>
<atom name="irn">7</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<tuple name="AssParentObjectRef">
<atom name="irn">2470</atom>
<atom name="EADUnitTitle"></atom>
</tuple>
</tuple>
<tuple>
<atom name="irn">8</atom>
<atom name="ObjectType"></atom>
<atom name="EADLevelAttribute"></atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<tuple name="AssParentObjectRef">
<atom name="EADUnitTitle"></atom>
<atom name="irn">7</atom>
</tuple>
</tuple>
</table>
<table name="ecatalogue">
<collection>
<tuple>
<atom name="irn">2470</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<atom name="EADLevelAttribute"></atom>
<tuple name="children">
<tuple>
<atom name="irn">5416</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<atom name="EADLevelAttribute"></atom>
<tuple name="children"></tuple>
</tuple>
<tuple>
<atom name="irn">7</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<atom name="EADLevelAttribute"></atom>
<tuple name="children">
<tuple>
<atom name="irn">8</atom>
<atom name="EADUnitID"></atom>
<atom name="EADUnitTitle"></atom>
<atom name="EADLevelAttribute"></atom>
<tuple name="children"></tuple>
</tuple>
</tuple>
</tuple>
</tuple>
</tuple>
</collection>
2470
5416
7.
8.
这里的挑战是可以有任意数量的顶级项和任意数量的子记录。而且,它们可以扩展到多个级别-我不知道子记录扩展到多深。找出记录之间关系的唯一方法是
<tuple name="AssParentObjectRef">
它提供直接父记录,如果记录没有父记录,则为空。如果我要使用XSLT,我只限于XSLT1.0
考虑到XSLT的xml格式,我认为XSLT可能是未来的发展方向,但我对XSLT几乎一无所知,我迄今为止的尝试毫无结果。我已经阅读了Muenchian方法,并认为这可能会有所帮助,下面是我迄今为止尝试过的一个示例(这可能公平地表明了我在XSLT方面是多么的新手:-):
我做得对吗?XSLT是这项工作的合适工具吗
编辑添加了所需输出中缺少的“tuple”标记。您应该这样尝试: XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="child" match="tuple" use="tuple[@name='AssParentObjectRef']/atom[@name='irn']" />
<xsl:template match="/table">
<table name="ecatalogue">
<collection>
<xsl:apply-templates select="tuple[not(tuple[@name='AssParentObjectRef']/atom[@name='irn'])]"/>
</collection>
</table>
</xsl:template>
<xsl:template match="tuple">
<tuple>
<xsl:copy-of select="atom"/>
<xsl:if test="key('child', atom[@name='irn'])">
<tuple name="children">
<xsl:apply-templates select="key('child', atom[@name='irn'])"/>
</tuple>
</xsl:if>
</tuple>
</xsl:template>
</xsl:stylesheet>
这里的结果与您发布的结果略有不同:
<?xml version="1.0" encoding="UTF-8"?>
<table name="ecatalogue">
<collection>
<tuple>
<atom name="irn">2470</atom>
<atom name="EADUnitID"/>
<atom name="EADUnitTitle"/>
<atom name="EADLevelAttribute"/>
<tuple name="children">
<tuple>
<atom name="irn">5416</atom>
<atom name="EADUnitID"/>
<atom name="EADUnitTitle"/>
</tuple>
<tuple>
<atom name="irn">7</atom>
<atom name="EADUnitID"/>
<atom name="EADUnitTitle"/>
<tuple name="children">
<tuple>
<atom name="irn">8</atom>
<atom name="ObjectType"/>
<atom name="EADLevelAttribute"/>
<atom name="EADUnitID"/>
<atom name="EADUnitTitle"/>
</tuple>
</tuple>
</tuple>
</tuple>
</tuple>
</collection>
</table>
2470
5416
7.
8.
但我不确定正确的结果是什么,因为您的示例不明确。您应该这样尝试: XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="child" match="tuple" use="tuple[@name='AssParentObjectRef']/atom[@name='irn']" />
<xsl:template match="/table">
<table name="ecatalogue">
<collection>
<xsl:apply-templates select="tuple[not(tuple[@name='AssParentObjectRef']/atom[@name='irn'])]"/>
</collection>
</table>
</xsl:template>
<xsl:template match="tuple">
<tuple>
<xsl:copy-of select="atom"/>
<xsl:if test="key('child', atom[@name='irn'])">
<tuple name="children">
<xsl:apply-templates select="key('child', atom[@name='irn'])"/>
</tuple>
</xsl:if>
</tuple>
</xsl:template>
</xsl:stylesheet>
这里的结果与您发布的结果略有不同:
<?xml version="1.0" encoding="UTF-8"?>
<table name="ecatalogue">
<collection>
<tuple>
<atom name="irn">2470</atom>
<atom name="EADUnitID"/>
<atom name="EADUnitTitle"/>
<atom name="EADLevelAttribute"/>
<tuple name="children">
<tuple>
<atom name="irn">5416</atom>
<atom name="EADUnitID"/>
<atom name="EADUnitTitle"/>
</tuple>
<tuple>
<atom name="irn">7</atom>
<atom name="EADUnitID"/>
<atom name="EADUnitTitle"/>
<tuple name="children">
<tuple>
<atom name="irn">8</atom>
<atom name="ObjectType"/>
<atom name="EADLevelAttribute"/>
<atom name="EADUnitID"/>
<atom name="EADUnitTitle"/>
</tuple>
</tuple>
</tuple>
</tuple>
</tuple>
</collection>
</table>
2470
5416
7.
8.
但是我不确定正确的结果是什么,因为你的例子模棱两可。你的例子不太清楚:孩子
元组s似乎保留了元组包装,但父母没有?对不起,这是个打字错误,你的例子不太清楚:孩子tuple
s似乎保留了tuple
wrapper,但父母没有?对不起,这是一个拼写错误,他们是故意的。太完美了,谢谢。你不会相信我花了多长时间来解决这个问题。我想XSLT不是我的专长。那太完美了,谢谢。你不会相信我花了多长时间来解决这个问题。我想XSLT不适合我。