-1

我正在使用以下模板从我的xml内容中删除 html 标签。它为少数xmls 工作,但为少数 s 失败,xml由于递归调用,堆栈溢出错误。任何人都可以提供相同的优化解决方案吗?

<xsl:template name="strip-tags">
    <xsl:param name="text"/>
    <xsl:choose>
        <xsl:when test="contains($text, '&lt;')">
            <xsl:value-of  select="substring-before($text, '&lt;')"/>
            <xsl:call-template name="strip-tags">
                <xsl:with-param name="text" select="substring-after($text, '&gt;')"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
4

2 回答 2

1

嗯,你可以

(a) 给自己一个进行尾调用优化的处理器(例如 Saxon),或者

(b) 给自己一个 XSLT 2.0 处理器,然后使用 xsl:analyze-string 重写它。

不过,还有一点:如果数据中的尖括号未按预期配对,则此代码可能会无限递归(在这种情况下,没有优化器会帮助您),例如,如果<在第一个 '>' 之前有一个字符特点。

于 2012-11-15T14:46:11.050 回答
0

似乎是一个冒险的策略。它将递归输入中的每个元素,这可能会产生数以百万计的元素并填满堆栈!怎么样,所有标签名称的模板匹配,例如下面的,只是“不要复制”但复制其他所有内容。我在 Pawson 上找到了这个,http: //www.dpawson.co.uk/xsl/sect2/N4554.html#d5769e474

<xsl:template match=" a | abbr | acronym | address | applet | area | b | base | basefont | bdo | big | blockquote | body | br | button | caption | center | cite | code | col | colgroup | dd | del | dfn | dir | div | dl | dt | em | fieldset | font | form | frame | frameset | h1 | h2 | h3 | h4 | h5 | h6 | head | hr | html | i | iframe | img | input | ins | isindex | kbd | label | legend | li | link | map | menu | meta | noframes | noscript | object | ol | optgroup | option | p | param | pre | q | s | samp | script | select | small | span | strike | strong | style | sub | sup | table | tbody | td | textarea | tfoot | th | thead | title | tr | tt | u | ul | var">

于 2012-11-15T14:07:07.850 回答