Если вы счастливы в возможности применения XSLT 2.0, может помочь следующее:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="//project/text()">
<xsl:value-of select="tokenize(normalize-space(.),' ')[1]" />
</xsl:template>
</xsl:stylesheet>
Объяснение: сначала normalize-space()
заменить все строки пробелов на один пробел (и вырезатьот начального и конечного пробелов), затем разбить на слова, затем взять первый.
В XSLT 1.0 вы могли бы использовать
<xsl:value-of select="substring-before(normalize-space(.), ' ')"/>
.Менее гибкий, если второе слово должно быть выбрано, но для первого слова оно работает ОК.
РЕДАКТИРОВАТЬ
вы спросили, как получить первую строку в XSLT 1.0- проблема в том, что здесь есть пробел в начале, который может содержать LF, поэтому вы не можете просто вставить подстроку перед первым LF.
Возможно, что приведенное ниже может быть улучшено, но он прекрасно работает:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="//project/text()">
<xsl:variable name="afterLeadingWS"
select="substring-after(., substring-before(.,substring-before(normalize-space(.), ' ')))"/>
<xsl:choose>
<xsl:when test="contains($afterLeadingWS, '
')">
<xsl:value-of select="substring-before($afterLeadingWS, '
')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$afterLeadingWS"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Объяснение:сначала получите первое слово, как и прежде, затем определите пробел перед этим первым словом, затем получите все после этого начального пробела, затем получите первую строку, которая является строкой перед символом LF.Может случиться так, что LF отсутствует, кроме, возможно, в начальном пробеле, отсюда и функция выбора.