2015-12-24 40 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]'。 –

相关问题