XPath:比较所有属性的第一个和最后一个以及 return 个唯一值

XPath: Compare first & last of all attributes & return unique values

我希望将所有第一个和最后一个属性相互比较,return 仅比较唯一值。

XML:

  <way>
    <nd ref="1"/>
    <nd ref="2"/>
    <nd ref="3"/>
    <tag k="highway"/>
  </way>
  <way>
    <nd ref="2"/>
    <nd ref="3"/>
    <nd ref="4"/>
    <tag k="highway"/>
  </way>
  <way>
    <nd ref="4"/>
    <nd ref="6"/>
    <nd ref="1"/>
    <tag k="highway"/>
  </way>
  <way>
    <nd ref="2"/>
    <nd ref="4"/>
    <nd ref="7"/>
    <tag k="highway"/>
  </way>
</osm>

预期输出:

<nd ref="3"/>
<nd ref="7"/>

我对 XSL 的了解不多。我一直在玩弄这两个 value-of 并且没走多远:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
<xsl:variable name="LastRef" select="osm/way/nd"/>
<xsl:template match="/">
    <!-- <xsl:value-of select="osm/way/nd[1]/@ref = osm/way/nd[last()]/@ref"/>  -->
    <xsl:value-of select="osm/way/nd[position() = 1 or position() = last()][not($LastRef)]"/> 
</xsl:template>
</xsl:stylesheet>

我也一直在根据此页面查看 preceding::https://www.oreilly.com/library/view/xslt-cookbook/0596003722/ch04s03.html

但我在黑暗中摸索。希望你能帮忙

我认为这听起来好像您想通过 ref 属性对那些 nd 元素(第一个和最后一个)进行分组,并且仅在它具有单个成员时才输出一个组,这可以是在 XSLT 2 或 3 中表示为

  <xsl:template match="osm">
    <xsl:for-each-group select="way/nd[position() = (1, last())]" group-by="@ref">
      <xsl:sequence select=".[not(current-group()[2])]"/>
    </xsl:for-each-group>
  </xsl:template>