2010-07-14 2 views
1

XSLT를 통해 한 단어를 구성하기위한 문장의 모든 단어의 첫 글자를 추출하려고합니다. 샘플 입력
문장의 모든 단어의 첫 글자를 추출하여 XSLT를 통해 한 단어로 만듭니다.

`ABC HBO ORACLE 123 (Hello Person)` 

예상 출력 : 사전에

AHO123HP 

감사합니다 :).

P. 나는 또한 XALAN 프로세서를 사용하고있다.

+0

원하는 출력에서 ​​숫자 일 때 완전한 단어를 원하는 것처럼 보입니다. 제발, 분명히 해줘. –

+0

@Alejandro 예, 있습니다. – Bilzac

답변

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', 
            ''), 
          '')),' ')"/> 
+0

감사합니다. 나 좀 도와 줘. – Bilzac

+0

@Bilzac : 당신은 건강합니다! –

1

다음 용액은 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> 
그러나이어야 당신에게 그것을 해결하는 방법에 대한 아이디어를 줄 수

아마도 이보다 더 나은 해결책이있을 수 있습니다. 그러나 이것은 예제를 해결합니다.

+0

제 지식에 XALAN은 XSLT 1.0 프로세서입니다. –

+0

알레한드로가 맞습니다. 1.0 프로세서입니다. 그러나 나는 당신의 논리를 사용하고 그것을 1.0에 맞출 수 있다고 생각합니다. 고마워요. :) – Bilzac

관련 문제