仅使用xpath匹配许多未知节点中的一个

时间:2009-09-21 10:50:37

标签: xml xslt xpath

我试图只匹配每个节点中的一个与通用匹配。这可以完全通用吗?我希望只是将每个节点中的一个与相同的本地名称()

匹配
<xsl:variable name="xmltree">
  <node />
  <anothernode />
  <node />
  <anothernode />
  <unknown />
  <anothernode />
  <node />
  <unknown />
</xsl:variable>

<xsl:template match="/">
  <xsl:apply-templates select="$xmltree/*" mode="MODULE"/>
</xsl:template>

<xsl:template match="*" mode="MODULE" /> <!-- EMPTY MATCH -->

<xsl:template match="node[1]|anothernode[1]|unknown[1]" mode="MODULE">
  <!-- Do something -->
</xsl:template>

1 个答案:

答案 0 :(得分:1)

这是一个分组问题,在XSLT 1.0中,最有效的分组方法是Muenchian方法。

如果元素数量不是太大,则以下短代码可能就足够了

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

    <xsl:template match="/*/*">
     <xsl:copy-of select=
      "self::*[not(preceding-sibling::*
                      [name() = name(current())]
                   )
               ]"/>
    </xsl:template>
</xsl:stylesheet>

将此转换应用于以下源XML文档

<t>
    <node />
    <anothernode />
    <node />
    <anothernode />
    <unknown />
    <anothernode />
    <node />
    <unknown />
</t>

生成了想要的结果

<node/>
<anothernode/>
<unknown/>

有人可能会研究所使用的XPath表达式,以便了解这个转换实际上每次首次出现具有特定名称的元素时都会复制。