0

我对 XSL Transformation 很陌生,这是问题所在。如果我有这个 xml 文件:

    <root> 
        <node id="a">
            <section id="a_1">
               <item id="0">
                    <attributes>
                        <color>Red</color>
                    </attributes>
               </item>
            </section>
            <section id="a_2">
               <item id="0">
                    <attributes>
                        <color>Red</color>
                    </attributes>
               </item>
            </section>            
        </node>

        <node id="b">
            <section id="b_1">
                <user id="b_1a">
                    <attribute>
                        <name>John</name>
                    </attribute>
                </user>

                <user id="b_1b">
                    <attribute></attribute>
                </user>

                <user id="b_1a">
                    <attribute>
                        <name>John</name>    
                    </attribute>
                </user>
            </section>
        </node>
 </root>

我希望输出是这样的:

<root> 
        <node id="a">
            <section id="a_1">
               <item id="0">
                    <attributes>
                        <color>Red</color>
                    </attributes>
               </item>
            </section>
            <section id="a_2">
               <item id="0">
                    <attributes>
                        <color>Red</color>
                    </attributes>
               </item>
            </section>            
        </node>

        <node id="b">
            <section id="b_1">
                <user id="b_1a">
                    <attribute>
                        <name>John</name>
                    </attribute>
                </user>

                <user id="b_1b">
                    <attribute></attribute>
                </user>

            </section>
        </node>
 </root>

问题是我不知道这个级别可以走多深,但只要它在同一级别并且有重复,我们就会将其删除。这有可能做到吗。我整天都在尝试解决这个问题,但没有任何线索。任何帮助将不胜感激。

干杯,约翰

4

1 回答 1

2

试试这个:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <!--If you want to remove any duplicate element (not just user,
  change the match to: match="*[@id = preceding::*/@id]"-->
  <xsl:template match="user[@id = preceding::user/@id]"/>

</xsl:stylesheet>

另外,我不确定“在同一级别”是什么意思,但如果元素名称也必须匹配,请使用此模板:(注意:此模板在 Saxon 9.3 中有效,但在 Xalan 或 Saxon 6.5 中无效.5.)

<xsl:template match="*[@id = preceding::*[name() = name(current())]/@id]"/>

更新:这是一个似乎适用于 Xalan 和 Saxon 6.5.5 的模板:

  <xsl:template match="*[@id = preceding::*/@id]">
    <xsl:if test="not(@id = preceding::*[name() = name(current())]/@id)">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>
于 2012-04-16T15:37:00.887 回答