我有一个XML文档,它有一个名为“Description”的XML节点
“描述”节点包含“这是一个长描述”之类的文本。
当加载XML文件并在浏览器中显示时,我只需要单词“long”来斜体。我知道我可以使用XSLT来设置整个Description节点的样式,但是如何仅在节点内容的一小部分上使用CSS样式呢?
答案 0 :(得分:2)
这个XSLT 1.0样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()[ancestor::Description]" name="replace">
<xsl:param name="pString" select="."/>
<xsl:choose>
<xsl:when test="contains($pString,' long ')">
<xsl:value-of select="substring-before($pString,' long ')"/>
<i> long </i>
<xsl:call-template name="replace">
<xsl:with-param name="pString"
select="substring-after($pString,' long ')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$pString"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
使用此输入:
<Description>This is a long description</Description>
输出:
<Description>This is a<i> long </i>description</Description>
这个XSLT 2.0样式表:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()[ancestor::Description]">
<xsl:analyze-string select="." regex="([\p{{P}}\p{{Z}}])long([\p{{P}}\p{{Z}}])">
<xsl:matching-substring>
<xsl:value-of select="regex-group(1)"/>
<i>long</i>
<xsl:value-of select="regex-group(2)"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
输出:
<Description>This is a <i>long</i> description</Description>
答案 1 :(得分:1)
你没有。正如CSS3规范所说,
选择器定义以下功能:
expression * element→boolean
即,没有选择除元素之外的任何东西的概念。
如果要将“long”斜体化,则需要将其放在单独的内联元素中。 <em>
可能是一个合适的选择。
您可以在将文档发送到浏览器之前在服务器端执行此操作,或者您可以使用JavaScript以及可能像正则表达式匹配这样简单的操作来在客户端执行此操作。