-1

コンテンツから html タグを削除するために、次のテンプレートを使用していxmlます。いくつかの s で機能していますが、再帰呼び出しによるスタック オーバー フロー エラーでxml、いくつかの 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 を使用してこれを書き換えます。

ただし、もう 1 つのポイント: データ内の山かっこが期待どおりにペアになっていない場合、たとえば<最初の '>' の前に文字がある場合、このコードは無限に再帰する可能性があります (この場合、オプティマイザーは役に立ちません)。キャラクター。

于 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 に答える