Как генерировать уникальные имена узлов из набора узлов? - PullRequest
1 голос
/ 25 июня 2019

У меня есть этот устаревший набор узлов, который по сути является графиком доставки:

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

Спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 25 июня 2019

Вы можете использовать технику под названием Muenchian Grouping , чтобы сделать это в XSLT 1.0 (поскольку это включает получение первого элемента для каждого отдельного значения, чтобы получить «группы»).

Начните с определения ключа следующим образом:

<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>
0 голосов
/ 26 июня 2019

Вы также можете сделать это, если используете XSLT 2.0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output indent="yes"></xsl:output>
<xsl:template match="destinations">
    <result>
    <xsl:for-each-group select="//item" group-by="distinct-values(.)">
        <xsl:copy><xsl:value-of select="."/></xsl:copy>
    </xsl:for-each-group>
    </result>
</xsl:template>

...