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"/>

我需要格式化@V属性中的值,以便在使用 XSLT 解析时,每个&lt;&lt;W上面的字母组成的值都应该替换为&lt; W,它们之间有一个空格。

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

4

2 回答 2

2

有可能的。在 XSLT 2.0 中,这将是一件轻而易举的事(使用正则表达式)。但是,这是 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 更新翻译,它也会处理数字和斜杠。

于 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 回答