xml - 如何从节点集中生成唯一的节点名称?
问题描述
我有这个遗留节点集,它本质上是一个运输时间表:
<destinations>
<voyage>
<entry>
<port>
<item>Zeebrügge</item>
</port>
</entry>
<entry>
<port>
<item>Bremerhaven</item>
</port>
</entry>
</voyage>
<voyage>
<entry>
<port>
<item>Bremerhaven</item>
</port>
</entry>
<entry>
<port>
<item>Zeebrügge</item>
</port>
</entry>
<entry>
<port>
<item>Vigo</item>
</port>
</entry>
</voyage>
<voyage>
<entry>
<port>
<item>Zeebrügge</item>
</port>
</entry>
</voyage>
<voyage>
<entry>
<port>
<item>Bremerhaven</item>
</port>
</entry>
</voyage>
</destinations>
有没有办法从该节点集中生成唯一 ports
的列表?
所以结果会是这样的:
<result>
<item>Zeebrügge</item>
<item>Bremerhaven</item>
<item>Vigo</item>
</result>
谢谢你的帮助!
解决方案
您可以在 XSLT 1.0 中使用一种称为Muenchian Grouping的技术来执行此操作(因为这涉及获取每个不同值的第一个元素以获取“组”)。
首先定义一个键,如下所示:
<xsl:key name="items" match="item" use="." />
要获得不同的项目,请执行此操作....
<xsl:copy-of select="//item[generate-id() = generate-id(key('items', .)[1])]" />
试试这个 XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="items" match="item" use="." />
<xsl:template match="/">
<result>
<xsl:copy-of select="//item[generate-id() = generate-id(key('items', .)[1])]" />
</result>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- node.js - chrome打开wss协议时如何解决ERR_DISALLOWED_URL_SCHEME?
- tensorflow - 如何计算 eval_metric_ops 中的中位数?
- ios - 按钮粒子效果 Swift
- gitlab - 在 gitlab 服务器中运行 .gitlab-ci.yml 文件的进程的名称是什么?
- vba - PowerShell 将 Excel 加载项拆分为单独的工作簿
- python - 子进程终止时如何运行函数?
- reactjs - 在阿波罗查询后发送道具
- python - for循环中的熊猫get_dummies
- elixir - Elixir, Absinthe 如何在与苦艾酒约会后创建用户?
- java - NamedParameterJdbcTemplate 不支持 SUM()?