首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xpath查找具有特定文本的节点在相同节点中的位置

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

Stack Overflow用户
提问于 2015-12-24 16:23:25
回答 1查看 49关注 0票数 0

在一个文档中有一组商标节点<tm>。每个节点<tm>内部包含文本节点-商标名.tm's之间可能存在相同的节点,这意味着它们具有相同的商标名称。我需要写的模板,将添加商标字符™(™),只有在每个商标的第一次出现。

示例:

代码语言:javascript
复制
<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>的第一次出现。

预期结果是:

代码语言:javascript
复制
<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>

这里的困难在于有相同的节点。此外,我不能为每个商标写一个单独的模板,一个模板应该匹配所有。

以下是解决方案的草案:

代码语言:javascript
复制
<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中的第一个。有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-24 16:37:56

使用键,就像在Muenchian分组(http://www.jenitennison.com/xslt/grouping/muenchian.xml)中一样,只有在XSLT2.0中,您可以使用is代替XSLT1.0中所需的generate-id()测试:

代码语言:javascript
复制
<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的身份上网。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34455438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档