好吧,我很好,真的卡住了。
我正在尝试从平面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'标记。
答案 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>
但我不确定正确的结果是什么,因为你的例子不明确。