HTML格式化XML节点中的部分内容

时间:2010-08-27 19:35:54

标签: html css xml xslt

我有一个XML文档,它有一个名为“Description”的XML节点

“描述”节点包含“这是一个长描述”之类的文本。

当加载XML文件并在浏览器中显示时,我只需要单词“long”来斜体。我知道我可以使用XSLT来设置整个Description节点的样式,但是如何仅在节点内容的一小部分上使用CSS样式呢?

2 个答案:

答案 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以及可能像正则表达式匹配这样简单的操作来在客户端执行此操作。