Извлеките первую букву каждого слова в предложении и объедините его в одно слово с помощью XSLT.

Я пытаюсь извлечь первую букву каждого слова для предложения, чтобы сформировать одно слово через XSLT. Пример ввода

`ABC HBO ORACLE 123 (Hello Person)` 

Ожидаемый результат:

AHO123HP

Заранее спасибо :).

P.S. Я также использую процессор XALAN.


person Bilzac    schedule 14.07.2010    source источник
comment
Из желаемого вывода похоже, что вам нужно полное слово, когда это число. Просьба уточнить.   -  person    schedule 15.07.2010


Ответы (2)


Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="text/text()" name="FirstLetterAndNumber">
        <xsl:param name="string" select="concat(normalize-space(translate(.,',.()`','')),' ')"/>
        <xsl:if test="$string != ''">
            <xsl:variable name="word" select="substring-before($string,' ')"/>
            <xsl:choose>
                <xsl:when test="number($word)=number($word)">
                    <xsl:value-of select="$word"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="substring($word,1,1)"/>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:call-template name="FirstLetterAndNumber">
                <xsl:with-param name="string" select="substring-after($string,' ')"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

С этим вводом:

<root>
<text>`ABC HBO ORACLE 123 (Hello Person)`</text>
<text>`ABC HBO ORACLE123 (Hello Person)`</text>
<text>`ABC 123 (Hello Person)`</text>
</root>

Результат:

<root>
    <text>AHO123HP</text>
    <text>AHOHP</text>
    <text>A123HP</text>
</root>

Примечание. Если вы заранее не знаете, какой специальный символ нужно удалить, выполните следующие действия:

<xsl:param name="string" 
     select="concat(
               normalize-space(
                 translate(.,
                           translate(.,
                                    ' qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890',
                                    ''),
                          '')),' ')"/>
person Community    schedule 15.07.2010
comment
Большое спасибо за ответ! Мне очень помогает. - person Bilzac; 16.07.2010

Следующее решение тестируется не в Xalan, а в Saxon 9B. Но это может по крайней мере дать вам представление о том, как ее решить:

Ввод:

<?xml version="1.0" encoding="UTF-8"?>
<text>ABC HBO ORACLE 123 (Hello Person)</text>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xsl:template match="text">
    <xsl:copy>
      <xsl:variable name="tokens" select="tokenize(.,' ')" as="xs:string+"/>
      <xsl:value-of select="
        for $i in $tokens return 
          if ($i castable as xs:integer) 
            then replace($i, '[^A-z\d]', '')
            else substring(replace($i, '[^A-z\d]', ''), 1, 1)" separator=""/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Вывод:

<?xml version="1.0" encoding="UTF-8"?>
<text>AHO123HP</text>

Вероятно, для этого есть лучшее решение, но это решает ваш пример.

person Per T    schedule 15.07.2010
comment
Насколько мне известно, XALAN — это процессор XSLT 1.0. - person ; 15.07.2010
comment
Алехандро прав, это процессор 1.0. Но я думаю, я могу использовать вашу логику и адаптировать ее к 1.0. Большое спасибо :) - person Bilzac; 15.07.2010