草庐IT

xml - XSLT:合并元素而不重复

coder 2024-06-30 原文

我想将一些元素从 XML 转换为文本,但要避免输出中出现重复项。 XML 应该是这样的:

<A>
  <B>
    <param1>value0</param1>
    <param2>value1</param2>
  </B>
  <B>
    <param1>value2</param1>
    <param2>value3</param2>
  </B>
  <C>
    <param3>valueC1</param3>
    <D>
      <param4>value0</param4>
      <param5>value4</param5>
    </D>
    <D>
      <param4>value0</param4>
      <param5>value5</param5>
    </D>
    <D>
      <param4>value2</param4>
      <param5>value6</param5>
    </D>
  </C>
  <C>
    <param3>valueC2</param3>
    <D>
      <param4>value0</param4>
      <param5>value5</param5>
    </D>
  </C>
</A>

输出:

OBJECT: param1=value0, param2=value1, param3=valueC1, param4=value0;
OBJECT: param1=value2, param2=value3, param3=valueC1, param4=value2;
OBJECT: param1=value0, param2=value1, param3=valueC2, param4=value0;

注意事项:

  • 对于每个 D 对象,使用 D.param4 = B.param1 寻找与 B 对象的匹配
  • 如果同一个 C 中有两个或多个 D 对象并与同一个 B 匹配,则只打印其中一个(在示例中,不对第二个 D 对象执行任何操作,因为它会产生与第一个相同的行一)
  • 如果有两个 D 对象与相同的 B 匹配,但在不同的 C 中,则打印两者(输出示例中的第三行)

我找了一些类似的问题,但在相同的情况下找不到。

我想这可以通过使用键来完成,但它太复杂了。

谢谢!

问候, 啤酒。

PS:对不起我的英语。

最佳答案

鉴于您没有在输出中使用任何param5,似乎可以将问题简化为

  • 对于每个 C
    • 找到所有 distinct B 元素,其 param1任何包含的 D 的 param4 匹配
    • 对于每一个
      • 再次提取 B/param1、B/param2、currentC/param3、B/param1(但标记为 param4)

这是使用模板实现这一目标的一种方法。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" />
  <xsl:key name="BbyParam1" match="B" use="param1" />

  <xsl:template match="/">
    <xsl:apply-templates select="A/C" />
  </xsl:template>

  <xsl:template match="C">
    <xsl:apply-templates select="key('BbyParam1', D/param4)">
      <xsl:with-param name="currentC" select="." />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="B">
    <xsl:param name="currentC" />
    <xsl:text>OBJECT: param1=</xsl:text>
    <xsl:value-of select="param1" />
    <xsl:text>, param2=</xsl:text>
    <xsl:value-of select="param2" />
    <xsl:text>, param3=</xsl:text>
    <xsl:value-of select="$currentC/param3" />
    <xsl:text>, param4=</xsl:text>
    <xsl:value-of select="param1" />
    <xsl:text>&#10;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

“找到所有 distinct B 元素,其 param1any 包含的 Ds 的 param4 匹配”是实际上非常简单,因为当您将节点集作为第二个参数传递给 key 函数时,它正是这样做的 - 它返回所有节点的集合,其键值为 < 的字符串值em="">任何参数节点集中的节点,并且返回的节点集(作为一个集合)保证不包含重复项。

关于xml - XSLT:合并元素而不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14852096/

有关xml - XSLT:合并元素而不重复的更多相关文章

  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 - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  3. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  4. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  5. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  6. ruby - Hanami link_to 助手只呈现最后一个元素 - 2

    我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm

  7. Ruby 哈希直接访问与合并 - 2

    有什么区别:@attr[:field]=new_value和@attr.merge(:field=>new_value) 最佳答案 如果您使用的是merge!而不是merge,则没有区别。唯一的区别是您可以在合并参数中使用多个字段(意思是:另一个散列)。例子:h1={"a"=>100,"b"=>200}h2={"b"=>254,"c"=>300}h3=h1.merge(h2)putsh1#=>{"a"=>100,"b"=>200}putsh3#=>{"a"=>100,"b"=>254,"c"=>300}h1.merge!(h2)pu

  8. ruby - 将n维数组的每个元素乘以Ruby中的数字 - 2

    在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

  9. arrays - 计算数组中的匹配元素 - 2

    给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at

  10. ruby - 正则表达式 - 保存重复捕获的组 - 2

    这就是我做的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","

随机推荐