首页 > 解决方案 > 如何从节点集中生成唯一的节点名称?

问题描述

我有这个遗留节点集,它本质上是一个运输时间表:

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

谢谢你的帮助!

标签: xmlxsltxslt-1.0

解决方案


您可以在 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>

推荐阅读