我是 XSLT/XML 的新手。
我有一个类似这样的 XML 文件:
<event>
<division name="Div1">
<team name="Team1">
<player firstname="A" lastname="F" />
<player firstname="B" lastname="G" />
<player firstname="C" lastname="H" />
<player firstname="D" lastname="G" />
</team>
<team name="Team2">
<player firstname="A" lastname="F" />
<player firstname="B" lastname="G" />
<player firstname="C" lastname="H" />
<player firstname="D" lastname="I" />
</team>
</division>
</event>
我正在尝试编写一个 XSL 转换(与 xsltproc 一起使用)来为我提供同一个团队中具有相同姓氏的球员的名字。
四处搜索后,我想到了这个:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:key name="lastnames" match="player" use="@lastname" />
<xsl:template match="/">
<xsl:for-each select="event/division/team">
<xsl:variable name="dups" select="player[generate-id() = generate-id(key('lastnames', @lastname)[2])]" />
<xsl:if test="$dups">
Team: <xsl:value-of select="@name" /> (<xsl:value-of select="../@name" />)
Players:
<xsl:for-each select="$dups">
<xsl:value-of select="@lastname" />, <xsl:value-of select="@firstname" />.
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
这样做的主要问题是,它为我提供了所有团队所有球员的重复数据,而不仅仅是每个团队内部的数据。
在上面的示例中,它应该只返回一次(对于 Team1 中的玩家 D G)。
小问题:这只打印第二次出现的重复项。最好它应该打印第 2、3、4 次……出现(第 1 次可以跳过)。 我知道这是因为键函数后的“[2]”。我发现的大多数示例都是关于如何删除重复项的,在这里我需要相反的方法,所以这是我发现可以给我(接近)我需要的东西的技巧。可能有更好的方法来实现这一目标......
感谢任何帮助。
谢谢, 布鲁诺
最佳答案
您走在正确的轨道上!所需的主要更改是对 key 进行调整 - 特别是需要考虑 @lastname值和关于父级的唯一信息<team>元素:
<xsl:key
name="kPlayerByLastnameAndTeam"
match="player"
use="concat(parent::team/@name, '+', @lastname)" />
要进行的另一项更改是您已经注意到的:您需要的不是 [2]。谓词以获取所有 重复项。诀窍是在 @match 中使用相同的 key 属性使得所有 other 元素都被选中:
key(
'kPlayerByLastnameAndTeam',
concat(parent::team/@name, '+', @lastname))
[not(generate-id() = generate-id(current()))]
要了解所有这一切,请查看这个完整的解决方案。
当这个 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes" method="text"/>
<xsl:strip-space elements="*"/>
<xsl:key
name="kPlayerByLastnameAndTeam"
match="player"
use="concat(../@name, '+', @lastname)"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="team">
<xsl:apply-templates
select="*[
generate-id() =
generate-id(key(
'kPlayerByLastnameAndTeam',
concat(../@name, '+', @lastname))[1])
]"/>
</xsl:template>
<xsl:template match="player">
<xsl:variable
name="vDups"
select="key(
'kPlayerByLastnameAndTeam',
concat(../@name, '+', @lastname))
[not(generate-id() = generate-id(current()))]"/>
<xsl:if test="$vDups">
<xsl:value-of
select="concat('Team: ', ../@name, ' (', ../../@name, ')')"/>
<xsl:text> Players: </xsl:text>
<xsl:apply-templates select="$vDups" mode="copy"/>
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
<xsl:template match="player" mode="copy">
<xsl:if test="position() > 1">; </xsl:if>
<xsl:value-of select="concat(@lastname, ', ', @firstname, '.')"/>
</xsl:template>
</xsl:stylesheet>
...针对提供的 XML 应用:
<event>
<division name="Div1">
<team name="Team1">
<player firstname="A" lastname="F"/>
<player firstname="B" lastname="G"/>
<player firstname="C" lastname="H"/>
<player firstname="D" lastname="G"/>
</team>
<team name="Team2">
<player firstname="A" lastname="F"/>
<player firstname="B" lastname="G"/>
<player firstname="C" lastname="H"/>
<player firstname="D" lastname="I"/>
</team>
</division>
</event>
...产生了想要的结果:
Team: Team1 (Div1)
Players: G, D.
关于xml - XSLT:在每个 child 中查找重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16909500/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr
在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c
我想找到给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?#Example"a-b-c-d".???(/\w-\w/)#=>["a-b","b-c","c-d"]expected#Solutionwithoutoverlappedresults"a-b-c-d".scan(/\w-\w/)#=>["a-b","c-d"],but"b-c"ismissing 最佳答案 在积极的前瞻中使用捕获:"a-b-c-d".scan(/(?=(\w-\w))/).flatten#=>["a-b","b-c","c-d"]参见Rubyde
这就是我做的a="%span.rockets#diamonds.ribbons.forever"a=a.match(/(^\%\w+)([\.|\#]\w+)+/)putsa.inspect这是我得到的#这就是我想要的#帮助?我尝试过但失败了:( 最佳答案 通常,您不能获得任意数量的捕获组,但如果您使用扫描,您可以为您想要捕获的每个标记获得一个匹配:a="%span.rockets#diamonds.ribbons.forever"a=a.scan(/^%\w+|\G[.|#]\w+/)putsa.inspect["%span","
这应该是一个简单的问题,但我找不到任何相关信息。给定一个Ruby中的正则表达式,对于每个匹配项,我需要检索匹配的模式$1、$2,但我还需要匹配位置。我知道=~运算符为我提供了第一个匹配项的位置,而string.scan(/regex/)为我提供了所有匹配模式。如果可能,我需要在同一步骤中获得两个结果。 最佳答案 MatchDatastring.scan(regex)do$1#Patternatfirstposition$2#Patternatsecondposition$~.offset(1)#Startingandendingpo
据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b
如何使用geminstall同时安装多个gem,同时指定我想要的版本?例子:geminstallakami-v1.2.0--ignore-dependenciesgeminstallatomic-v1.1.14--ignore-dependenciesgeminstallaws-s3-v0.6.2--ignore-dependenciesgeminstallbackports-v3.3.0--ignore-dependenciesgeminstallbrendanlim-sms-fu-v1.0.0--ignore-dependenciesgeminstallbuilder-v3.1.3