使用xpath在相同节点中查找具有特定文本的节点的位置

时间:2015-12-24 16:23:26

标签: xpath xslt-2.0

单个文档中有一组商标节点<tm>。每个节点<tm>都包含文本节点 - 商标名称。 tm's中可能存在相同的节点,这意味着它们具有相同的商标名称。我需要编写一个模板,只会在每个商标的第一次出现时添加商标字符™(&#8482;)。

示例:

<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中的第一个。有可能吗?

1 个答案:

答案 0 :(得分:2)

使用密钥,如Muenchian分组(http://www.jenitennison.com/xslt/grouping/muenchian.xml),只有使用XSLT 2.0,您可以使用bcrypt(phashp($data['password']))而不是XSLT 1.0中需要的is测试:

generate-id()

在线http://xsltransform.net/ncdD7mC