我是 xslt 的新手,请提供基于属性值比较两个节点的 xslt。
输入.xml:
<comp>
<alink>
<link id="0003"/>
<link id="0001"/>
<link id="0002"/>
</alink>
<bibsection>
<bib id="0001">2007</bib>
<bib id="0002">2008</bib>
<bib id="0003">2009</bib>
</bibsection>
</comp>
我的输出应该是,
输出.xml:
<comp>
<alink>
<link id="0003"/><year>2009</year>
<link id="0001"/><year>2007</year>
<link id="0002"/><year>2008</year>
</alink>
<bibsection>
<bib id="0001">2007</bib>
<bib id="0002">2008</bib>
<bib id="0003">2009</bib>
</bibsection>
</comp>
提前致谢。
最佳答案
一个完整、高效、简短的转换,使用键:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kBibById" match="bib" use="@id"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="link">
<xsl:call-template name="identity"/>
<year><xsl:value-of select="key('kBibById', @id)"/></year>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<comp>
<alink>
<link id="0003"/>
<link id="0001"/>
<link id="0002"/>
</alink>
<bibsection>
<bib id="0001">2007</bib>
<bib id="0002">2008</bib>
<bib id="0003">2009</bib>
</bibsection>
</comp>
产生了想要的、正确的结果:
<comp>
<alink>
<link id="0003"/>
<year>2009</year>
<link id="0001"/>
<year>2007</year>
<link id="0002"/>
<year>2008</year>
</alink>
<bibsection>
<bib id="0001">2007</bib>
<bib id="0002">2008</bib>
<bib id="0003">2009</bib>
</bibsection>
</comp>
解释:
identity rule “按原样”复制每个匹配的节点。
有一个模板覆盖身份模板——它匹配任何 link 元素。该模板主体中的代码通过名称调用身份模板来处理匹配的 link 元素,然后构造一个 year 元素,其中包含一个值为 the 的文本节点 child第一个 bib 元素的字符串值,其 id 属性与匹配的 link 的 id 属性具有相同的值元素。选择此 bib 元素是使用 key() 完成的 引用 xsl:key 的函数 名为“kBibById”的指令。
注意:
上述身份规则的链接暂时无法使用——暂时请使用 Internet 文件中的这个链接:
http://web.archive.org/web/20081229160200/http://www.dpawson.co.uk/xsl/sect2/identity.html
关于xml - 根据属性比较2个节点集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11330506/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP
假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)