草庐IT

xml - 根据属性比较2个节点集

coder 2024-07-02 原文

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

解释:

  1. identity rule “按原样”复制每个匹配的节点。

  2. 有一个模板覆盖身份模板——它匹配任何 link 元素。该模板主体中的代码通过名称调用身份模板来处理匹配的 link 元素,然后构造一个 year 元素,其中包含一个值为 the 的文本节点 child第一个 bib 元素的字符串值,其 id 属性与匹配的 linkid 属性具有相同的值元素。选择此 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/

有关xml - 根据属性比较2个节点集的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的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

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的: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?并散列所有无济于事。

  5. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型: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

  6. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  7. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  8. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  9. ruby - Chef Ruby 遍历 .erb 模板文件中的属性 - 2

    所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP

  10. ruby - 获取数组中的值并最小化某个类属性的最优雅的方法是什么? - 2

    假设我有以下类(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)

随机推荐