Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 消除XSLT中重复的同级元素_Xml_Xslt_Duplicates_Duplicate Data - Fatal编程技术网

Xml 消除XSLT中重复的同级元素

Xml 消除XSLT中重复的同级元素,xml,xslt,duplicates,duplicate-data,Xml,Xslt,Duplicates,Duplicate Data,我希望显示一个相同级别节点名称的列表,没有重复项 假设我有 <a> <b> <c /> <d /> <d /> </b> <b> <e /> <c /> <f /> </b> </a> 我想显示c,d,e,f。对于类似的问

我希望显示一个相同级别节点名称的列表,没有重复项

假设我有

<a>
    <b>
        <c />
        <d />
        <d />
    </b>
    <b>
        <e />
        <c />
        <f />
    </b>
</a>


我想显示c,d,e,f。对于类似的问题,我已经找到了几种解决方案,从输出中消除重复的同级,但是我在消除重复的“表兄妹”时遇到了困难。

我会使用XPath前置同级轴,并检查相同的本地名称。未经测试:

<xsl:template match="c|d|e|f">
    <xsl:if test="local-name(.) != local-name(preceding-sibling::*[1])">
       <xsl:copy-of select="."/>
    </xsl:if>
</xsl:template>

注意,如果一个元素与其前一个同级元素具有相同的名称,则不会复制该元素。

一种可能性:

<!-- make all element nodes accessible by their nesting level -->
<xsl:key name="kNodesByLevel" match="*" use="count(ancestor-or-self::*)" />

<xsl:template match="/">
  <!-- select all nodes on one particular level -->
  <xsl:variable name="lvl" select="key('kNodesByLevel', 3)" />

  <!-- step through them... -->
  <xsl:for-each select="$lvl">
    <xsl:sort select="name()" /> 
    <xsl:variable name="name" select="name()" />
    <!-- ... and group them by node name -->
    <xsl:if test="generate-id() = generate-id($lvl[name() = $name][1])"> 
      <xsl:copy-of select="." />
    </xsl:if>
  </xsl:for-each>
</xsl:template>

您提供的XML的输出:

<c />
<d />
<e />
<f />


我想你的意思是
前面的兄弟姐妹
;-)此外,这不会适用于同一级别上的所有节点,仅适用于同一父节点中的节点,并且仅适用于它们已在文档中排序的节点;我确定了轴的名称。我现在意识到这并不能解决OP的问题。