我有一个XML节点,它是下面一个更大的XML的一部分,它包含下标中的某些符号。
<MT N="Abstract" V="Centre-of-mass energies in the region 142<W<sub>γp</sub><293 GeV with the ZEUS detector at HERA using an integrated luminosity"/>
我需要格式化@V
属性中的值,这样每个<
都会被替换为<W
,而< W
替换为{{1}},当使用XSLT解析时,它们之间有一个空格。
这可能吗?首选XSLT 1.0解决方案。
答案 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,'<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< W< sub>γp</sub><293 GeV with the ZEUS detector at HERA using an integrated luminosity
显然,如果用/和1234567890更新翻译,它也会处理数字和斜线。
答案 1 :(得分:0)
XSLT 2.0中的简单:
replace(@V, '(<)(\p{L})', '$1 $2')
XSLT 1.0中的难度要大得多,我没有时间尝试它。