我希望有人能帮我一把。这个问题已经困扰了我好几天了。我的问题的根源是我想在 2 个元素之间按文档顺序向所有节点添加标记。
我有一个与此类似的 XML 文档:
<Employees>
<Employee>
<Title>Mr.</Title>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Employee>
<Employee>
<Title>Mr.</Title>
<FirstName>Tom</FirstName>
<LastName>Doe</LastName>
</Employee>
</Employees>
当我使用 Oracle 的标记搜索命中的“标记”函数并搜索字符串“John Doe”时,我得到如下 XML 结果:
<Employees>
<Employee>
<Title>Mr.</Title>
<FirstName><hitStart/>John</FirstName>
<LastName>Doe<hitEnd/></LastName>
</Employee>
<Employee>
<Title>Mr.</Title>
<FirstName>Tom</FirstName>
<LastName>Doe</LastName>
</Employee>
</Employees>
我想将其转换为突出显示命中的 XHTML。例如,以下 XHTML 将是一个有用的结果:
<TABLE>
<TR>
<TD>Mr. <b style="color:red">John Doe</b></TD>
<TR>
<TR>
<TD>Tom Doe</TD>
</TR>
</TABLE>
我尝试编写使用应用模板或命名模板来浏览文档的样式表,但我无法让它们工作。使用 apply-templates 很棘手,因为我无法传递一个参数来说明节点是否在 hitStart 和 hitEnd 元素内。使用命名模板很棘手,因为我需要以不同方式处理文本和元素节点,而这在 XSLT 1.0 中无法做到。帮助将不胜感激。
谢谢,布赖恩
感谢所有帮助过的人!!!!你们太棒了!
这是我决定的:
<xsl:template match="/*|node()">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()[1]"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="text()[preceding::*[self::hitStart or self::hitEnd][1][self::hitStart]
and following::*[self::hitStart or self::hitEnd][1][self::hitEnd]]">
<span style="color:red;font-style:italic;font-weight:bold"><xsl:value-of select="."/></span>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="hitStart|hitEnd">
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>