从平面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>

好吧,我真的被卡住了

我试图从平面xml文件中重新创建层次结构,但我不知道如何继续。我使用的xml文件看起来有点像这样:

<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不适合我。