我正在尝试使用 XSLT 从平面 XML 创建嵌套 xml,但是我发现它只创建一个嵌套并忽略源 XML 中的其余记录。
我的 XML 输入如下所示:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!-- Data -->
<table name="ecatalogue">
<!-- Row 1 -->
<tuple>
<atom name="irn">2470</atom>
<atom name="EADUnitID">da.01</atom>
<atom name="EADUnitTitle">Some title</atom>
<tuple name="AssParentObjectRef" />
</tuple>
<!-- Row 2 -->
<tuple>
<atom name="irn">5416</atom>
<atom name="EADUnitID">da.01.01</atom>
<atom name="EADUnitTitle">Child of Some title</atom>
<tuple name="AssParentObjectRef">
<atom name="EADUnitTitle">Some Title</atom>
<atom name="irn">2470</atom>
</tuple>
</tuple>
<!-- Row 3 -->
<tuple>
<atom name="irn">6</atom>
<atom name="EADUnitID">da.01.02</atom>
<atom name="EADUnitTitle">Child of Some title 2</atom>
<tuple name="AssParentObjectRef">
<atom name="EADUnitTitle">Some Title</atom>
<atom name="irn">2470</atom>
</tuple>
</tuple>
<!-- Row 4 -->
<tuple>
<atom name="irn">8</atom>
<atom name="EADUnitID">da.01.02.01</atom>
<atom name="EADUnitTitle">3rd Generation</atom>
<tuple name="AssParentObjectRef">
<atom name="EADUnitTitle">Child of Some Title 2</atom>
<atom name="irn">6</atom>
</tuple>
</tuple>
<!-- Row 5 -->
<tuple>
<atom name="irn">1130</atom>
<atom name="EADUnitID">da.02</atom>
<atom name="EADUnitTitle">Another title</atom>
<tuple name="AssParentObjectRef" />
</tuple>
<!-- Row 6 -->
<tuple>
<atom name="irn">54</atom>
<atom name="EADUnitID">da.02.01</atom>
<atom name="EADUnitTitle">Child of Another title</atom>
<tuple name="AssParentObjectRef">
<atom name="EADUnitTitle">Another Title</atom>
<atom name="irn">1130</atom>
</tuple>
</tuple>
<!-- Row 7 -->
<tuple>
<atom name="irn">16</atom>
<atom name="EADUnitID">da.02.02</atom>
<atom name="EADUnitTitle">Child of Another Title 2</atom>
<tuple name="AssParentObjectRef">
<atom name="EADUnitTitle">Another Title</atom>
<atom name="irn">1130</atom>
</tuple>
</tuple>
<!-- Row 8 -->
<tuple>
<atom name="irn">22</atom>
<atom name="EADUnitID">da.02.02.01</atom>
<atom name="EADUnitTitle">3rd Generation</atom>
<tuple name="AssParentObjectRef">
<atom name="EADUnitTitle">Child of Another Title 2</atom>
<atom name="irn">1130</atom>
</tuple>
</tuple>
</table>
XSLT 应该识别顶级记录,然后添加子记录。对于最高记录,它应该将其 irn 和 EADUnitTitle 分别复制为 TopID 和 TopTitle。对于每个 child ,它应该包括直接的 ParentID 和 ParentTitle 以及 TopID 和 TopTitle。输出应如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<table name="ecatalogue">
<collection>
<tuple>
<atom name="irn">2470</atom>
<atom name="EADUnitID">da.01</atom>
<atom name="EADUnitTitle">Some title</atom>
<atom name="TopTitle">Some title</atom>
<atom name="TopID">2470</atom>
<tuple name="children">
<tuple>
<atom name="irn">5416</atom>
<atom name="EADUnitID">da.01.01</atom>
<atom name="EADUnitTitle">Child of Some title</atom>
<atom name="ParentTitle">Some title</atom>
<atom name="ParentID">2470</atom>
<atom name="TopTitle">Some title</atom>
<atom name="TopID">2470</atom>
</tuple>
<tuple>
<atom name="irn">6</atom>
<atom name="EADUnitID">da.01.02</atom>
<atom name="EADUnitTitle">Child of Some title 2</atom>
<atom name="ParentTitle">Some title</atom>
<atom name="ParentID">2470</atom>
<atom name="TopTitle">Some title</atom>
<atom name="TopID">2470</atom>
<tuple name="children">
<tuple>
<atom name="irn">8</atom>
<atom name="EADUnitID">da.01.02.01</atom>
<atom name="EADUnitTitle">3rd Generation</atom>
<atom name="ParentTitle">Child of Some title 2</atom>
<atom name="ParentID">6</atom>
<atom name="TopTitle">Some title</atom>
<atom name="TopID">2470</atom>
</tuple>
</tuple>
</tuple>
</tuple>
</tuple>
</collection>
<collection>
<tuple>
<atom name="irn">1130</atom>
<atom name="EADUnitID">da.02</atom>
<atom name="EADUnitTitle">Another title</atom>
<atom name="TopTitle">Another title</atom>
<atom name="TopID">1130</atom>
<tuple name="children">
<tuple>
<atom name="irn">54</atom>
<atom name="EADUnitID">da.02.01</atom>
<atom name="EADUnitTitle">Child of Another title</atom>
<atom name="ParentTitle">Another title</atom>
<atom name="ParentID">1130</atom>
<atom name="TopTitle">Another title</atom>
<atom name="TopID">1130</atom>
</tuple>
<tuple>
<atom name="irn">16</atom>
<atom name="EADUnitID">da.02.02</atom>
<atom name="EADUnitTitle">Child of Another title 2</atom>
<atom name="ParentTitle">Another title</atom>
<atom name="ParentID">1130</atom>
<atom name="TopTitle">Another title</atom>
<atom name="TopID">1130</atom>
<tuple name="children">
<tuple>
<atom name="irn">22</atom>
<atom name="EADUnitID">da.02.02.01</atom>
<atom name="EADUnitTitle">3rd Generation</atom>
<atom name="ParentTitle">Child of Another title 2</atom>
<atom name="ParentID">16</atom>
<atom name="TopTitle">Another title</atom>
<atom name="TopID">1130</atom>
</tuple>
</tuple>
</tuple>
</tuple>
</tuple>
....
</collection>
</table>
我的 XSLT 是:
<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>
虽然这将对记录进行分组,但输出只是这些集合之一。因此,从一个包含 3524 条记录的文件中,我得到了一个包含 24 条记录的集合。
我已经尝试用 XSLT 替换:
<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="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
虽然这会返回所有嵌套结构,但它还会复制嵌套中的记录,因此它们本身成为集合。
关于我哪里出错的任何想法?
编辑 2017 年 6 月 6 日
当我使用时:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
我得到了重复项(注意下面示例中的“id”是为了说明而添加的):
<record id='1'>
<children>
<record id='2'>
<children>
<record id='3'>
<children>
<record id='4'></record>
</children>
</record>
</children>
</record>
</children>
</record>
<record id='2'>
<children>
<record id='3'>
<children>
<record id='4'></record>
</children>
</record>
</children>
</record>
<record id='3'>
<children>
<record id='4'></record>
</children>
</record>
<record id='2'></record>
<record id='3'></record>
<record id='4'></record>
有没有办法删除重复的记录,这样我就只剩下嵌套的记录了?
编辑 - 问题元组
<!-- Row 3378 -->
<tuple>
<atom name="irn">115024</atom>
<atom name="ObjectType">Archives</atom>
<atom name="EADLevelAttribute">Series</atom>
<atom name="EADUnitID">D42.PL.05</atom>
<atom name="EADUnitTitle">Correspondence and Company Administration: Box Files</atom>
<atom name="EADScopeAndContent">Box files of Port Line official company correspondence and administrative papers. These papers were collected towards historical research and include correspondence from earlier periods c.1890 although the bulk of the papers relate to the two periods 1937-1939 and 1949-1951.</atom>
<atom name="EADBiographyOrHistory"></atom>
<tuple name="AssParentObjectRef">
</tuple>
<atom name="EADArrangement">The papers in this series have been retained in the original order as stored by Port Line Ltd. The contents of each box file are listed as a typescript paper and have been listed in this catalogue. Box file titles have been listed in the title field of each item in this series.</atom>
<atom name="EADUnitDate">1890-1952</atom>
<table name="EADExtent_tab">
<tuple>
<atom name="EADExtent">7 boxes.</atom>
</tuple>
</table>
<atom name="EADAccruals"></atom>
<atom name="EADOtherFindingAid"></atom>
<atom name="EADRelatedMaterial"></atom>
<tuple name="EADAcquisitionInformationRef">
</tuple>
<atom name="EADAppraisalInformation"></atom>
<atom name="EADSeparatedMaterial"></atom>
<atom name="EADTitleProper"></atom>
<atom name="EADPublicationStatement"></atom>
<atom name="EADCustodialHistory"></atom>
<atom name="EADSource"></atom>
<atom name="EADNote"></atom>
<atom name="EADAccessRestrictions">Some items in this series are closed access.</atom>
<atom name="EADUseRestrictions"></atom>
</tuple>
<!-- Row 3379 -->
<tuple>
<atom name="irn">115025</atom>
<atom name="ObjectType">Archives</atom>
<atom name="EADLevelAttribute">Item</atom>
<atom name="EADUnitID">D42.PL.05.01</atom>
<atom name="EADUnitTitle">File: Australian Homeward Trade</atom>
<atom name="EADScopeAndContent">Various papers relating to Australian Homeward Trade and includes the following:For proof copies of the Australian Homeward Agreement see D42/PL5/6.</atom>
<atom name="EADBiographyOrHistory"></atom>
<tuple name="AssParentObjectRef">
<atom name="EADUnitTitle">Correspondence and Company Administration: Box Files</atom>
<atom name="irn">115024</atom>
</tuple>
<atom name="EADArrangement"></atom>
<atom name="EADUnitDate">1920-1936</atom>
<table name="EADExtent_tab">
<tuple>
<atom name="EADExtent">1 file.</atom>
</tuple>
</table>
<atom name="EADAccruals"></atom>
<atom name="EADOtherFindingAid"></atom>
<atom name="EADRelatedMaterial"></atom>
<tuple name="EADAcquisitionInformationRef">
</tuple>
<atom name="EADAppraisalInformation"></atom>
<atom name="EADSeparatedMaterial"></atom>
<atom name="EADTitleProper"></atom>
<atom name="EADPublicationStatement"></atom>
<atom name="EADCustodialHistory"></atom>
<atom name="EADSource"></atom>
<atom name="EADNote"></atom>
<atom name="EADAccessRestrictions"></atom>
<atom name="EADUseRestrictions"></atom>
</tuple>
最佳答案
如果您想要为每个顶级父 tuple 创建一个 collection 元素,我认为您需要做的就是拥有一个 xsl:for-each 获取父级,并在其中移动 collection 元素的创建。
<xsl:template match="/table">
<table name="ecatalogue">
<xsl:for-each select="tuple[not(tuple[@name='AssParentObjectRef']/atom[@name='irn'])]">
<collection>
<xsl:apply-templates select="." />
</collection>
</xsl:for-each>
</table>
</xsl:template>
关于xml - 从平面 xml 创建嵌套 xml 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43801463/
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake