문제

예를 들어, 'UserLicenSecode'태그를 '사용자 라이센스 코드'로 변환하여 열 헤더가 조금 더 멋지게 보이도록 태그를 하단으로 대문자 경계로 분할 할 수 있습니까?

나는 Perl의 정규 표현식을 사용하여 과거에 이와 같은 일을했지만 XSLT는 저에게 완전히 새로운 볼 게임입니다.

그러한 템플릿을 만드는 데있어서 모든 포인터는 대단히 감사 할 것입니다!

감사합니다 Krishna

도움이 되었습니까?

해결책

재귀를 사용하여 XSLT의 문자열을 걸어 모든 문자를 평가할 수 있습니다. 이렇게하려면 하나의 문자열 매개 변수 만 허용하는 새 템플릿을 만듭니다. 첫 번째 문자를 확인하고 대문자 인 경우 공간을 작성하십시오. 그런 다음 캐릭터를 작성하십시오. 그런 다음 단일 문자열 내부의 나머지 문자로 템플릿을 다시 호출하십시오. 이것은 당신이하고 싶은 일을 초래할 것입니다.

그것은 당신의 포인터 일 것입니다. 템플릿을 해결하려면 시간이 좀 필요합니다. :-)


특히 모든 것이 내부에 공간을 얻기 위해 약간의 테스트가 필요했습니다. (나는 이것에 대한 캐릭터를 오용했다!) 그러나이 코드는 당신에게 아이디어를 주어야한다 ...

이 XML을 사용했습니다.

<?xml version="1.0" encoding="UTF-8"?>
<blah>UserLicenseCode</blah>

그리고이 스타일 시트 :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output method="text"/>
    <xsl:variable name="Space">*</xsl:variable>
    <xsl:template match="blah">
    <xsl:variable name="Split">
        <xsl:call-template name="Split">
            <xsl:with-param name="Value" select="."/>
            <xsl:with-param name="First" select="true()"/>
        </xsl:call-template></xsl:variable>
        <xsl:value-of select="translate($Split, '*', ' ')" />
    </xsl:template>
    <xsl:template name="Split">
        <xsl:param name="Value"/>
        <xsl:param name="First" select="false()"/>
        <xsl:if test="$Value!=''">
            <xsl:variable name="FirstChar" select="substring($Value, 1, 1)"/>
            <xsl:variable name="Rest" select="substring-after($Value, $FirstChar)"/>
                <xsl:if test="not($First)">
                    <xsl:if test="translate($FirstChar, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '..........................')= '.'">
                        <xsl:value-of select="$Space"/>
                    </xsl:if>
                </xsl:if>
                <xsl:value-of select="$FirstChar"/>
                <xsl:call-template name="Split">
                    <xsl:with-param name="Value" select="$Rest"/>
                </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

그리고 나는 이것을 결과로 얻었다 :

User License Code

공백과 다른 흰색 공간 캐릭터는 XML에서 벗어나는 경향이 있기 때문에 대신 '*'를 사용하여 공간으로 번역했습니다.

물론이 코드는 개선 될 수 있습니다. 10 분 동안 일할 수있는 일입니다. 다른 언어에서는 코드 줄이 적을 수 있지만 XSLT에서는 포함하는 코드 줄의 양을 고려할 때 여전히 매우 빠릅니다.

다른 팁

XSLT + FXSL 솔루션 (XSLT 2.0에서는 거의 동일한 코드가 XSLT 1.0 및 FXSL 1.X에서 작동합니다.:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
xmlns:testmap="testmap"
exclude-result-prefixes="f testmap"
>
   <xsl:import href="../f/func-str-dvc-map.xsl"/>
   <testmap:testmap/>

   <xsl:output omit-xml-declaration="yes" indent="yes"/>

   <xsl:template match="/">
     <xsl:variable name="vTestMap" select="document('')/*/testmap:*[1]"/>

     '<xsl:value-of select="f:str-map($vTestMap, 'UserLicenseCode')"
       />'
   </xsl:template>

    <xsl:template name="mySplit" match="*[namespace-uri() = 'testmap']"
     mode="f:FXSL">
      <xsl:param name="arg1"/>

      <xsl:value-of select=
       "if(lower-case($arg1) ne $arg1)
         then concat(' ', $arg1)
         else $arg1
       "/>
    </xsl:template>
</xsl:stylesheet>

위의 변환이 모든 소스 XML 문서에 적용되면 (사용되지 않음) 예상되는 올바른 결과가 생성됩니다.

'사용자 라이센스 코드'

주목하십시오:

  1. FXSL 기능/템플릿의 DVC 버전을 사용하고 있습니다. str-map(). 이것은 다른 함수와 문자열의 두 인수를 취하는 고차 기능 (HOF)입니다. str-map() 문자열의 모든 문자에 함수를 적용하고 결과의 연결을 반환합니다.

  2. 하위 케이스 () 함수가 사용되므로 (XSLT 2.0 버전에서) 라틴 알파벳 만 제한되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top