2009-09-21 79 views
1

我試圖只匹配每個節點中的一個與一般匹配。這可以通用嗎?我會者優先只匹配相同的本地名稱()每個節點的一個只用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

這是一個組的問題和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表達式,以便了解這種轉換是否真正複製具有特定名稱的元素的每次首次出現。

+0

謝謝。這將解決它。 Thanx Dimitre(xslt-master)。 – Sveisvei 2009-09-23 17:44:34