2016-08-16 3 views
0

Saxon 9.7, XSLT 3.0을 사용하여 텍스트 문자열에서 대괄호로 묶인 용어를 선택한 다음 용어의 중복 값을 제거하려고합니다.XSLT REGEX 패턴 일치

지금까지 원하는 문자열을 토큰 화하고 중복 값을 제거하는 함수를 선택하는 템플릿을 발견했습니다. 그러나 문자열의 토큰 화에 맞는 정규식을 얻을 수 없었습니다.

<column> 
    <columnDerivationPrompt>Option 1: (No visit windowing)</columnDerivationPrompt> 
    <columnDerivationDescription>Set to collected visit name [EG.VISIT] Set to 'POST-BASELINE MINIMUM' for the new observation generated for derviation type minimum [ADEG.DTYPE] = 'MINIMUM' 
    Set to 'POST-BASELINE MAXIMUM' for the new observation generated for derviation type maximum [ADEG.DTYPE]= 'MAXIMUM' 
    </columnDerivationDescription> 
    <columnDerivationPrompt>Option 2: (User defined visit windows)</columnDerivationPrompt> 
    <columnDerivationDescription>Set to a re-defined visit range based on user-defined input, using formatting of Analysis Relative Day [ADEG.ADY] range in conjunction with Analysis Window Target [ADEG.AWTARGET] and Analysis Window Diff from Target [ADEG.AWTDIFF] to determine analysis visit. 
    Set to 'POST-BASELINE MINIMUM' for the new observation generated for derviation type minimum [ADEG.DTYPE] = 'MINIMUM' 
    Set to 'POST-BASELINE MAXIMUM' for the new observation generated for derviation type maximum [ADEG.DTYPE]= 'MAXIMUM' 
    </columnDerivationDescription> 
</column> 

내가 원하는 무엇

EG.VISIT ADEG.DTYPE ADEG.DTYPE ADEG.ADY ADEG.AWTARGET ADEG.AWTDIFF ADEG.DTYPE ADEG.DTYPE 

에서 중복을 제거 할 필요가 텍스트에서 가져온 용어의 문자열

을 보려면 여기를

전체 텍스트 내 XML이다
EG.VISIT ADEG.DTYPE ADEG.ADY ADEG.AWTARGET ADEG.AWTDIFF 

내 XSLT 템플릿 및 기능

<xsl:variable name="test"> 
    <xsl:if test="contains($string,'[')"> 
     <xsl:variable name="relevant-part" select="substring-before(substring-after($string,'['),']')"/> 
     <xsl:variable name="remainder" select="substring-after($string,']')"/> 

     <xsl:value-of select="$relevant-part"/> 
     <xsl:if test="contains($remainder,'[')"> 
      <xsl:text disable-output-escaping="yes"> </xsl:text> 
     </xsl:if> 
     <xsl:call-template name="find-relevant-text"> 
      <xsl:with-param name="string" select="$remainder"/> 
     </xsl:call-template> 
    </xsl:if> 
    </xsl:variable> 


    <xsl:value-of select="myfn:sortCSV($test)"/> 
</xsl:template> 



<xsl:function name="myfn:sortCSV" as="xs:string*"> 
    <xsl:param name="csvString" as="xs:string"/> 

    <!-- Split up string and remove duplicates --> 
    <xsl:variable name="values" select="distinct-values(tokenize($csvString,'\W+\.\W+'))" as="xs:string*"/> 
    <!-- Return all elements, sorted --> 
    <xsl:for-each select="$values"> 
     <xsl:sort/> 
     <!-- We don't return empty strings --> 
     <xsl:sequence select=".[.!='']"/> 
    </xsl:for-each> 
</xsl:function> 

내가 예를 들어, 식별하는 데 사용 된 정규식 EG.VISIT 또는 ADEG.DTYPE. 따라서 CC.CCCC에서 CCCC.CCCCCCCC (여기서 C는 char [A-Z] 임)를 포함한 모든 패턴.

내가 얻고 출력은 그래서 어떤 중복 제거되지 않았다

EG.VISIT ADEG.DTYPE ADEG.DTYPE ADEG.ADY ADEG.AWTARGET ADEG.AWTDIFF ADEG.DTYPE ADEG.DTYPE 

이다.

질문 : 누구든지 내 표현이나 코드에 문제가있는 것을 볼 수 있습니까?

+0

'\ w + \. \ w +'를 사용하십시오. '\ W'는 단어가 아닌 char과 일치합니다. '\ w'는 char이라는 단어와 일치합니다. 가장 좋은 점은'[A-Z] + \. [A-Z] +'로 제한하는 것입니다. 일치시키고 자하는 항목이'대문자'+'''''대문자 ''패턴을 따르고 있기 때문입니다. –

답변

1

나도 XSLT 2.0 XSLT와 함께, analyze-string을 사용 xsl:anyalyze-string 또는 XSLT 3.0 그것은 한 줄입니다 방법을 사용하여 같은 이름의 기능을 가진 :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math fn" 
    version="3.0"> 

    <xsl:template match="column"> 
     <xsl:value-of select="distinct-values(analyze-string(., '\[([A-Z]+\.[A-Z]+)\]')//fn:match/fn:group[@nr = 1])"/> 
    </xsl:template> 

</xsl:stylesheet> 

출력은 EG.VISIT ADEG.DTYPE ADEG.ADY ADEG.AWTARGET ADEG.AWTDIFF입니다.

추출 된 문자열을 정렬하려면 <xsl:value-of select="sort(distinct-values(analyze-string(., '\[([A-Z]+\.[A-Z]+)\]')//fn:match/fn:group[@nr = 1]))"/>을 사용하십시오.

+0

완벽하게 일했습니다. Martin 고마워! – Huw

2

정규식의 경우 \W단어가 아닌 문자과 일치하며 대문자 (소문자)는 일치하지 않습니다. \w은 char이라는 단어와 일치합니다.

그러나, 최고의 당신이 uppercase + . + uppercase 패턴을 따르는 일치 할 항목을 말 이후 [A-Z]+\.[A-Z]+로 제한하는 것입니다.

는 참조 regex demo