1

以下のような大きなXMLの一部であるXMLノードがあり、下付き文字に特定の記号が含まれています。

<MT N="Abstract" V="Centre-of-mass energies in the region 142&lt;W&lt;sub&gt;γp&lt;/sub&gt;&lt;293 GeV with the ZEUS detector at HERA using an integrated luminosity"/>

XSLTで解析するときに、上記のようにアルファベットが続くものはすべて、それらの間に1つのスペースを入れて、として置き換える必要があるように、@V属性の値をフォーマットする必要があります。&lt;&lt;W&lt; W

これは可能ですか?XSLT1.0ソリューションが推奨されます。

4

2 に答える 2

2

可能です。XSLT 2.0では、それは(正規表現を使用した)楽勝になります。ただし、これはXSLT1.0の「あなたが言ったこと」の直接的なスクリプトです。

<xsl:template match="/">
    <xsl:call-template name="process">
        <xsl:with-param name="text" select="/tutorial/MT/@V"/>
    </xsl:call-template>
</xsl:template>

<xsl:template name="process">
    <xsl:param name="text" select="."/>
    <xsl:variable name="modtext" select="translate($text,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ','aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')"/>
    <xsl:variable name="pretext" select="substring-before($modtext,'&lt;a')"/>        
    <xsl:choose>
        <xsl:when test="not($pretext)">
            <xsl:value-of select="$text"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:variable name="endpos" select="string-length($pretext)+1"/>
            <xsl:value-of select="concat(substring($text,1, $endpos),' ')"/>
            <xsl:call-template name="process">
                <xsl:with-param name="text"
                    select="substring($text,$endpos+1)"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

数字や/文字でおかしな動作をしますが、これはあなたが求めたものを生み出します。

それは以下を生成します:

Centre-of-mass energies in the region 142&lt; W&lt; sub&gt;γp&lt;/sub&gt;&lt;293 GeV with the ZEUS detector at HERA using an integrated luminosity

明らかに、/および1234567890で翻訳を更新すると、数字とスラッシュも処理されます。

于 2012-07-18T08:24:47.400 に答える
0

XSLT 2.0で簡単:

replace(@V, '(&lt;)(\p{L})', '$1 $2')

XSLT 1.0でははるかに難しく、十分に難しいので、試す時間がありません。

于 2012-07-18T08:24:05.347 に答える