带有“小于”符号的XSLT格式字符串

时间:2012-07-18 06:51:41

标签: xml string xslt

我有一个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"/>

我需要格式化@V属性中的值,这样每个&lt;都会被替换为&lt;W,而&lt; W替换为{{1}},当使用XSLT解析时,它们之间有一个空格。

这可能吗?首选XSLT 1.0解决方案。

2 个答案:

答案 0 :(得分:2)

有可能。在XSLT 2.0中,它将是一个轻而易举的(带有正则表达式)。但是,这是直接的,你所说的&#39; XSLT 1.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更新翻译,它也会处理数字和斜线。

答案 1 :(得分:0)

XSLT 2.0中的简单:

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

XSLT 1.0中的难度要大得多,我没有时间尝试它。