xml - 使用 XSLT 将单词包装在标签中

标签 xml xslt xslt-1.0

如何在 XSLT 中将 span 标签(或任何标签)包裹在单个单词周围?我正在使用 XSLT1,但每次尝试时似乎都卡住了。

本质上,我想传递一个段落(或一串文本):

<p>This is my text!</p>

并像这样包装每个单词,保留每个单词之间的空格和标点符号:

<p><span class="word-1">This</span> <span class="word-2">is</span> <span class="word-3">my</span> <span class="word-4">text!</span>

这主要是为了展示目的,如果有任何帮助,我将不胜感激

最佳答案

这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="pSeparators">&#xA;&#x9;&#x20;,.;:?!()'"</xsl:param>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="p/text()" name="tokenize">
        <xsl:param name="pString" select="."/>
        <xsl:param name="pMask"
                   select="translate(.,translate(.,$pSeparators,''),'')"/>
        <xsl:param name="pCount" select="1"/>
        <xsl:choose>
            <xsl:when test="not($pString)"/>
            <xsl:when test="$pMask">
                <xsl:variable name="vSeparator"
                              select="substring($pMask,1,1)"/>
                <xsl:variable name="vString"
                              select="substring-before($pString,$vSeparator)"/>
                <xsl:call-template name="tokenize">
                    <xsl:with-param name="pString" select="$vString"/>
                    <xsl:with-param name="pMask"/>
                    <xsl:with-param name="pCount" select="$pCount"/>
                </xsl:call-template>
                <xsl:value-of select="$vSeparator"/>
                <xsl:call-template name="tokenize">
                    <xsl:with-param name="pString"
                               select="substring-after($pString,$vSeparator)"/>
                    <xsl:with-param name="pMask"
                                    select="substring($pMask,2)"/>
                    <xsl:with-param name="pCount"
                                    select="$pCount + boolean($vString)"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <span class="word-{$pCount}">
                    <xsl:value-of select="$pString"/>
                </span>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

输出:

<p><span class="word-1">This</span> <span class="word-2">is</span> <span class="word-3">my</span> <span class="word-4">text</span>!</p>

注意:通过多个分隔符进行分词。 编辑:更好的名字。将空格字符添加到分隔符序列。

关于xml - 使用 XSLT 将单词包装在标签中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4899901/

相关文章:

xml - 无法使用 BPMN 2.0 XSD 验证 XML 与元素类型 "xsi"关联的属性 "xsi:type"的前缀 "conditionExpression"未绑定(bind)

xslt - 从 Sitecore 中的 Xslt 辅助函数类修改页面控件

php - 如何将字符串与 Xpath 1.0 进行比较?

xml - XSLT:将单个元素的属性转换为新元素

xml - XSLT - 创建动态网格

xml - XSLT - XML 转换和删除空标记

具有属性和 anyType 子元素的 XML 模式元素

xml - 可以使用 Doxygen、SandcaSTLe 或其他文档生成器来记录 XML 吗?

Android:xml布局问题

xml - 使用 XSLT 生成 XSLT 的一些有用结构是什么?