2015-12-24 38 views
0

在單個文檔中有一組商標節點<tm>。每個節點<tm>包含文本節點 - 商標名稱。 tm's之間可能有相同的節點,這意味着它們具有相同的商標名稱。我需要編寫一個模板,用於將商標字符™(&#8482;)僅添加到每個商標的首次出現處。使用xpath在相同節點中查找具有特定文本的節點的位置

實施例:

<doc> 
    <a><tm>A</tm></a> 
    <tm>A</tm> 
    <tm>B</tm> 
    <b><tm>B</tm></b> 
    <a><b><c><tm>A</tm></c></b></a> 
</doc> 

只有<tm>A</tm><tm>B</tm>第一事件應被處理。

預期的結果是:

<doc> 
    <a><tm>A&#8482;</tm></a> 
    <tm>A</tm> 
    <tm>B&#8482;</tm> 
    <b><tm>B</tm></b> 
    <a><b><c><tm>A</tm></c></b></a> 
</doc> 

的困難,這裏是有相同的節點。此外,我無法爲每個商標分別編寫一個模板,一個模板應該匹配所有商標。

這裏是解決方案的草案:

<xsl:template match="tm"> 
    <xsl:variable name="text" select="text()"/> 
    <xsl:variable name="same_tms" select="//tm[text()=$text]"/> 
    <xsl:if test=" --- current tm is the first among $same_tms --- "> 
    <xsl:value-of select="concat(text(), '&#8482;')"/> 
    </xsl:if> 
</xsl:template> 

我不知道怎麼寫,將檢查當前<tm>是中$same_tms第一個通用的測試條件。可能嗎?

回答

2

使用的關鍵,如Muenchian分組的(http://www.jenitennison.com/xslt/grouping/muenchian.xml),只有使用XSLT 2.0,您可以使用is代替generate-id()測試,你將需要在XSLT 1.0:

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

    <xsl:key name="tm" match="tm" use="."/> 

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

    <xsl:template match="tm[. is key('tm', .)[1]]"> 
     <xsl:copy> 
      <xsl:value-of select="concat(., '&#8482;')"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:transform> 

在線爲http://xsltransform.net/ncdD7mC

+0

完美,謝謝! – lagivan

+1

很顯然'is'運算符也會解決你的方法。是$ same_tms [1]'。 –

相關問題