Предполагая, что этот xml (тот, который вы опубликовали, сформирован неправильно):
<div xmlns:core="http://www.w3.org/core">
<core:renderedItem>
<span class="harvard_title">Whose Ecosystem is it Anyway: Private and Public Rights under New Approaches to Biodiversity Conservation</span>
'
<span>
<em>Journal of Human Rights and the Environment</em>
</span>
.
</core:renderedItem>
</div>
Вы можете получить нужный текст с помощью этого кода xsl:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:core="http://www.w3.org/core"
exclude-result-prefixes="xsl">
<xsl:output omit-xml-declaration="yes" method="xml" indent="yes" />
<xsl:template match="/">
<xsl:value-of select="substring-before(div/core:renderedItem/span[@class = 'harvard_title'], ':')" />
</xsl:template>
</xsl:stylesheet>
При этом: span[@class = 'harvard_title']
вы получаете текст внутри диапазона, а с функцией substring-before
вы получаете только текст перед двоеточием.
Надеюсь, поможет.
Редактировать: вы можете использовать if
, чтобы учесть случай, когда в тексте нет двоеточия, но вы можете сделать это с помощью шаблонов:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:core="http://www.w3.org/core"
exclude-result-prefixes="xsl">
<xsl:output omit-xml-declaration="yes" method="xml" indent="yes" />
<xsl:template match="/">
<xsl:apply-templates select="div/core:renderedItem/span[@class = 'harvard_title']" />
</xsl:template>
<!-- generic template, for span elements with class = 'harvard_title' -->
<xsl:template match="span[@class = 'harvard_title']">
<xsl:value-of select="." />
</xsl:template>
<!-- more specific template, for those ones containing a colon -->
<xsl:template match="span[@class = 'harvard_title'][contains(.,':')]">
<xsl:value-of select="substring-before(., ':')" />
</xsl:template>
</xsl:stylesheet>
27.05.2014