3

オンデマンドで正規表現パターンを生成したいのですが、どういうわけか失敗します。誰かが理由を知っていて、助けてくれるかもしれません。

私が達成したいのは、出力で(例として)太字でマークされるテキストを定義する要素を持つことです

ソース xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
    <cd>
        <strong>Empire</strong>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
    </cd>
    <cd>
        <strong>your</strong>
        <strong>heart</strong>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
    </cd>
</catalog>

XSL:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="no"/>
    <xsl:template match="/">
        <html>
            <body>
                <table border="1">
                    <xsl:for-each select="catalog/cd">
                        <tr>
                            <td>
                                <xsl:call-template name="addBold">
                                    <xsl:with-param name="text" select="title" />
<xsl:with-param name="replace"><xsl:variable name="temp"><xsl:for-each select="strong">|<xsl:value-of select="." /></xsl:for-each></xsl:variable>(<xsl:value-of select='substring-after($temp,"|")' />)</xsl:with-param>
                                </xsl:call-template>
                            </td>
                            <td>
                                <xsl:value-of select="artist" />
                            </td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template name="addBold">
    <xsl:param name="text" />
    <xsl:param name="replace" />
    <xsl:analyze-string select="$text" regex="$replace">

        <xsl:matching-substring>
            <b><xsl:value-of select="regex-group(1)" /></b>
        </xsl:matching-substring>

        <xsl:non-matching-substring>
            <xsl:value-of select="." />
        </xsl:non-matching-substring>

    </xsl:analyze-string>

    </xsl:template>
</xsl:stylesheet>

$replaceパラメータには、たとえば次のものが含まれます。(your|heart). xsl:analyze-stringしかし、要素内で一致することはありません。

$replaceハードコードされた " "に置き換えると(your|heart)、常に正常に動作します..

私が見逃した重要なことはありますか?変数/パラメータをパターンとして使用できないのですか? または、適切にフォーマットされていることを確認する必要がありますか? これは call-template パラグラフで行いました。

4

2 に答える 2

2

属性値テンプレート、つまり属性に使用する必要があり<xsl:analyze-string select="$text" regex="{$replace}">ますregex

于 2012-10-28T11:13:59.860 に答える
2

あなたの問題は、のregex属性内で変数参照を使用していることですxsl:analyze-string。regex 属性は、文字列を入力として受け入れます。

現在、値をregex文字列リテラル "$replace" (何にも一致しません) として評価しています。

変数を評価し、その文字列値を使用するには、属性値テンプレートを使用する必要がありregexます。

<xsl:analyze-string select="$text" regex="{$replace}"> 

また、replace パラメータの REGEX を作成する式を次のように簡略化できます。

<xsl:with-param name="replace" select="concat('(',string-join(strong,'|'),')')">                                     
于 2012-10-28T11:14:08.160 に答える