从平面xml

时间:2016-06-28 10:45:01

标签: xml xslt

好吧,我很好,真的卡住了。

我正在尝试从平面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>

这里的挑战是可以有任意数量的顶级项目和任意数量的子记录。此外,它们可以扩展到多个级别 - 我不知道子记录有多深。找出记录之间关系的唯一方法是

<tuple name="AssParentObjectRef">

给出直接父记录,如果记录没有父记录则为空。如果我要使用XSLT,我只能使用XSLT 1.0。

鉴于它在xml中我认为XSLT可能是前进的方式,但我对XSLT几乎一无所知,到目前为止我的尝试都没有产生任何结果。我已经阅读了Muenchian方法,并认为这可能有所帮助,下面是我迄今为止尝试过的一个例子(这可能是我在XSLT中有多少新手的公平指示:-)):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output indent="yes"/>

  <xsl:key name="parent-irn" match="tuple[@name='AssParentObjectRef']" use="atom[@name='irn']" />

  <xsl:template match="/table/tuple">
    <xsl:copy>
      <xsl:apply-templates select="*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/table/tuple">
    <xsl:if test="generate-id() = generate-id(key('parent-irn', atom[@name='irn'])[1])">
      <collection>
        <xsl:attribute name="title">
          <xsl:value-of select="tuple[@name='AssParentObjectRef']"/>
        </xsl:attribute>
        <xsl:for-each select="key('parent-irn', atom[@name='irn'])">
          <tuple>
            <xsl:copy-of select="atom[@name='EADUnitTitle']" />
            <xsl:copy-of select="atom[@name='EADUnitID']" />
            <xsl:copy-of select="atom[@name='EADLevelAttribute']" />
          </tuple>
        </xsl:for-each>
      </collection>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet> 

我是否在正确的轨道上? XSLT甚至是这项工作的合适工具吗?

编辑从所需的输出添加了缺少的'tuple'标记。

1 个答案:

答案 0 :(得分:2)

你应该这样试试:

XSLT 1.0

    toggleButton = (ToggleButton)findViewById(R.id.sound);
    final MediaPlayer mp = MediaPlayer.create(this, R.raw.theme);
    if(toggleButton.isChecked())
        mp.start();
    toggleButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(!toggleButton.isChecked()){
                mp.pause();
            }
            else {
                mp.start();
                mp.isLooping();
            }
        }
     });

此处的结果与您发布的结果略有不同:

<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>

但我不确定正确的结果是什么,因为你的例子不明确。