2016-08-16 11 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> 

の私のXMLは、私は私が

を見たいのですがどのような

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

から重複を削除する必要がテキストから抽出した語句の文字列です。

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> 

\W+\.\W+ Iが例えば識別するために使用されてきた正規表現であります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'は単語以外の文字と一致します。 '\ w'は単語charにマッチします。あなたが '大文字' + '' '大文字' 'のパターンに従うと言うので、' [A-Z] + \。[A-Z] + 'に制限するのが最善です。 –

答えて

1

は、それがワンライナーでください:

<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

完璧に作業しました。マーティンありがとう! – Huw

2

正規表現の場合、\Wと一致し、単語以外の文字はであり、大文字(小文字も含む)と一致することに注意してください。 \wは、単語charと一致します。

しかし、最高のは、あなたがuppercase + . + uppercaseパターンをたどると一致する項目を言うので、[A-Z]+\.[A-Z]+にそれを制限することです。

私はそのアプローチを使用して、XSLT xsl:anyalyze-stringまたはXSLT 3.0と同じ名前の関数を持ついずれかのXSLT 2.0で、analyze-stringを使用することになりregex demo

関連する問題